/********************************************************************************
*解析所有试题json数据，将树形结构的数据分解成线性数据
********************************************************************************/
var G_AllTest; // = new TestData(jsonAllTest); 
/********************************************************************************
函数名：OneTest
功能：一道试题的数据结构
输入参数: 无
返回值：无
创建信息：黎萍（2014-05-19）
修改记录：兰涛（2014-05-22）
审查人：韦友爱（2014-05-26）
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function OneTest() {
	this.testNO = 0;	//试题编号
	this.style = '';	//试题类型
	this.type = '';		//试题所属题型
	this.score = 0;	//每题分数

	//以下三个索引用于定位json中的对应数据
	this.styleItemIndex = 0;	// 题型ID,json数据中的StyleID
	this.testItemIndex = 0;	// 大标题ID,json数据中各种题型的ID
	this.subTestItemIndex = -1;	//小题ID,针对A3题型的A3TestItemIndex和B题型的BTestItemIndex; testNO 试题的编号

	//下面4个字段值用于记录用户在做题过程中的答题信息
	this.userReply = ''; //用户的答案
	this.isRight = false; //是否回答正确
	this.fav = false; //收藏
	this.userNote = ''; //用户笔记
	this.time = ''; //用户笔记时间
	this.selected = 0;	//标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
	this.state = 'uncommited';	//标记当前试题是否提交了答案：uncommited 未答，commited 已答
	this.lastState='';	//用户上一次操作试题的状态
	this.action = '';	//记录试题的当前操作
	this.lastAction = '';	//用户上一次操作试题的动作
	this.userSeekHelp = '';	//用户的求助内容
	this.userExplain = '';	//用户的个人对试题的解析内容
	this.userDiscuss = '';	//用户添加的讨论信息
	this.userFeedback = {};	//用户的纠错内容
	this.discussCount =	0;	//当前试题讨论信息总数
	this.userCrrect='';//当前用户纠正的答案
	this.statisticsData = '';	//当前试题答题统计数据
}

/********************************************************************************
函数名：OneTestShow
功能：一道试题显示时的数据结构
输入参数：无
返回值：无
创建信息：兰涛（2014-05-28）
修改记录：黎萍（2014-05-28） 增加注释及函数体中属性的操作
修改记录：黎萍（2014-06-24） 增加输入参数AllTestID,StyleID 并增加注释
修改记录：黎萍（2014-07-03） 增加输入参数cptID,sbjID,srcID,subTestID 并增加注释
修改记录：黎萍（2014-07-04） 增加输入参数score并增加注释
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function OneTestShow() {
	this.cptID = 0; //章节ID
    this.sbjID = 0; //科目ID
    this.srcID = 0;	//来源ID
	this.allTestID = 0;	//试题的AllTestID
	this.styleID = 0;	//试题类型ID
	this.testNO = 0;	//试题编号
	this.testType = '';	//试题所属题型
	this.subTestType = '';	//小题所属题型
	this.testStyle = '';	//试题类型
	this.styleExplain = '';	//试题类型说明
	this.frontTitle = '';	//共用题干，针对A3Test
	this.title = '';	//试题标题
	this.selectedItems = '';	//试题选项
	this.answer = '';	//试题答案
	this.testPoint = '';	//考试重点
	this.explain = '';	//解题思路
	this.isFav = 0;	//是否收藏
	this.userNote = '';	//用户笔记
	this.subTestID = -1;	//小题id（针对A3题型、B题型）
	this.score = 0;	//每题分数
	this.time='';//时间
	this.answerType = 0;	//标记填空题答案是否按照顺序进行答案比对
}

/********************************************************************************
函数名：TestData
功能：试题数据
输入参数:无
返回值：无
创建信息：兰涛（2014-05-28）
修改记录：黎萍（2014-05-28） 增加函数注释
审查人：兰涛（2014-06-26）
 *******************************************************************************/
function TestData() {
	//私有变量
	var _index = 0; //试题数组索引
	var _jsonAllTest = {}; //试题json数据
	var _arrAllTest = []; //试题数组:数组元素为OneTest结构体：通过TestNO找到StyleItemIndex,TestItemIndex,SubTestItemIndex，然后再定位到_jsonAllTest中的对应数据
	var _isVip = 0;	//标记是否是VIP用户
	var _examHistoryID = '';	//答题历史ID
	var _title = '';	//界面上展示的标题
	var _shareUrl = '';	//共享生成的url
	var _replay = G_Prg.getQueryString('replay');
	var _testJson = '';
	var _fromUrl = G_Prg.getQueryString('fromUrl');
	if(_replay === '1'){
		_testJson = G_Storage.getLocalStorageValue(G_Cookie.getUserID()+'_'+G_Cookie.getAppEName()+'_testJson');
		_isVip = _testJson.isVip;
		_examHistoryID = _testJson.examHistoryID;
		_fromUrl = _testJson.url;
	}
	var _arrContrast=[];
	var _arrContrastChildTableID = [];	//试题AllTestID_childTableID数组，childTableID没有时，为-1；用于获取试题的做题记录,上一个数组接口不好处理  [{大题ID, 小题ID}],如[{"AllTestID": 1,"ChildTableID"：-1}]
	var _configJson = {};	//模拟考场配置json
	var _curAllTestID = 0;	//用户答题明细中最后答的试题ID
	var _configIDArr = [];	//会计从业模拟考场配置id数组集合
	var _configIDArrIndex = 0; 	//会计从业模拟考场配置数组索引
	var _data_KJCY = 0;	//记录模拟考场缓存数据
	var _arrUserTest = [];	//用户答题info数据包
	var _maxTestTime = '';	//最近学习时间
	
	_init(); //初始化数据
	
	//私有函数
	/********************************************************************************
	函数名：_init
	功能：初始化试题数据
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-13） 添加函数注释
	修改记录：黎萍（2014-06-13） 去掉参数jsonAllTest
              韦友爱（2014-07-23）添加callback回调函数，添加从章节最终列表页跳转传来的type参数的判断
			  黎萍（2015-05-12）增加对执业护士的易混易错试题数据的获取控制
              黎萍（2015-06-23）修改对执业护士、临床执业医师、临床执业助理医师的易混易错取题方式，避免重复取题
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _init() {
		var appID = G_Cookie.getAppID();
 		if (!appID) {
 			G_Prg.throw('程序运行错误，TestData._init : appID = "'+appID+'",获取数据出现异常'); 
 		}
        var appEName = G_Cookie.getAppEName();
		if (!appEName) {
 			G_Prg.throw('程序运行错误，TestData._init : appEName = "'+appEName+'",获取数据出现异常'); 
 		}
		var curPage=G_Prg.getQueryString('page');
		if(!curPage){
			curPage=1;
		}
		var fromUrl = G_Prg.getQueryString('fromUrl'); 
        var callback=function(){
            window.location.href = fromUrl+'?fromUrl=doExam-index';
        }
		if(_replay === '1'){
			_jsonAllTest = _testJson.jsonAllTest;	//试题数据
			_arrAllTest = _testJson.arrAllTest;	//试题数据结构体数组
			//还原现场：如果是批阅或者背题模式下，恢复现场只保留之前操作到的当前试题，之前的操作清空
			//for(var i = 0; i < _arrAllTest.length; i++){
//				if(_arrAllTest[0].state === 'marked' || _arrAllTest[0].state === 'recite'){
////					_arrAllTest = [];
////					_initArrAllTest();	//初始化结构体数组
//				}
			//}
			G_Prg.$('loadingDiv').style.display = 'none';	
		}else{
		switch (fromUrl){
//			default:
//				_jsonAllTest = _getAllTestJSON(appID);	//获取试题json数据
//			break;
            default:
                var cptID=G_Cookie.getCptID('CPTID');
                if(!cptID){
                    G_Prg.throw('程序运行错误，TestData._init : cptID = "'+cptID+'",获取数据出现异常'); 
                }
                var type = G_Prg.getQueryString('type');
                var testNum = G_Prg.getQueryString('testNum');
                switch(type){
                    case 'myError':
						_isVip = 1;
                        _jsonAllTest = _getErrorTestJson(appID,appEName,curPage,cptID,testNum,callback);	//获取用户做错的试题
                    break;
                    case 'myNote':
						_isVip = 1;
                        _jsonAllTest = _getTestNoteJson(appID,appEName,curPage,cptID,testNum,callback);	//获取有用户笔记的试题
                    break;
                    case 'myFav':
						_isVip = 1;
                        _jsonAllTest = _getFavTestJson(appID,appEName,curPage,cptID,testNum,callback);	//获取用户收藏的试题数据
                    break;
                    case 'myNotDone':
						_isVip = 1;
                        _jsonAllTest = _getNotDoneJson(appID,cptID,callback);	//获取用户未做的试题数据
                    break;
                    
                    default:
                        _jsonAllTest = _getAllTestJSON(cptID,appID,callback);//获取试题json数据
                    break;
                }
            break;
			case 'searchExam':
                var type = G_Prg.getQueryString('type');
                switch(type){
                    case 'userError':
						_isVip = 1;
                        _jsonAllTest = _getErrorTestJson(appID,appEName,curPage,-1,50,callback);	//获取用户做错的试题
                    break;
                    case 'errorRank':
						_isVip = 1;
                        _jsonAllTest = _getErrorRankJson(appID,appEName,curPage,50,callback);	//获取用户做错的试题
                    break;
                    case 'findTest':
						_isVip = 1;
                        _jsonAllTest = _getSearchExamJson(appEName,curPage,callback);	//获取有用户笔记的试题
                    break;
                    case 'userFav':
						_isVip = 1;
                        _jsonAllTest = _getFavTestJson(appID,appEName,curPage,-1,50,callback);	//获取用户收藏的试题数据
                    break;
                    case 'favRank':
						_isVip = 1;
                        _jsonAllTest = _getFavRankJson(appID,appEName,curPage,50,callback);	//获取用户收藏的试题数据
                    break;
                    case 'userNote':
				        _isVip = 1;
				        _jsonAllTest = _getTestNoteJson(appID,appEName,curPage,-1,50,callback);	//获取有用户笔记的试题
			        break;
                    case 'noteRank':
				        _isVip = 1;
				        _jsonAllTest = _getNoteRankJson(appID,appEName,curPage,50,callback);	//获取有用户笔记的试题
			        break;
                }
			break;
			//case 'default.html':
			case 'mockExam':
				_data_KJCY = _getCacheData();
				if(_data_KJCY === 0){
					_jsonAllTest = _getMockExamJson(appID,appEName);	//获取模拟考场的随机试题
				}else{
					_jsonAllTest = _data_KJCY.jsonAllTest;
					_arrAllTest = _data_KJCY.arrAllTest;
					G_Prg.$('loadingDiv').style.display = 'none';
				}
				_isVip = 1;
			break;
			case 'yhyc':
				var testData = [];
				if (G_Prg.checkApiPurview('', '易混易错', '') === 2 || G_Prg.checkApiPurview('', '易混易错', '') === 4) {
					_isVip = 1;
					testData = _getEasyErrorJson(curPage);
				} else {
					_isVip = 0;
					testData = _getEasyErrorJson(1);
				}
				easyErrorData = G_SetTestInfo.replaceImgURL(easyErrorData); //设置图片路径
				_jsonAllTest = easyErrorData;
				var dataLen = _jsonAllTest.StyleItems.length;
				for (var i = 0; i < dataLen; i++) {
					_jsonAllTest.StyleItems = testData;
				}
				G_Prg.$('loadingDiv').style.display = 'none';
				break;
			case 'video_play':
				var testData = [];
				if (G_Prg.checkApiPurview('', '易混易错', '') === 2 || G_Prg.checkApiPurview('', '易混易错', '') === 4) {
					_isVip = 1;
					testData = _getEasyErrorJson(curPage);
				} else {
					_isVip = 0;
					testData = _getEasyErrorJson(1);
				}
				easyErrorData = G_SetTestInfo.replaceImgURL(easyErrorData);	//设置图片路径
				_jsonAllTest = easyErrorData;
				var dataLen = _jsonAllTest.StyleItems.length;
				for (var i = 0; i < dataLen; i++) {
					_jsonAllTest.StyleItems = testData;
				}
				G_Prg.$('loadingDiv').style.display = 'none';
				break;
			case 'video-list':
				var cptID = G_Cookie.getCptID();
				if (!cptID) {
					G_Prg.throw('程序运行错误，TestData._init : cptID = "' + cptID + '",获取数据出现异常');
				}
				_jsonAllTest = _getForecastTest(cptID, appID, callback);
				break;
			case 'Five':
                _jsonAllTest = _getKnowledgeTestJSON2();//根据知识点id获取当前知识点试题
                _initArrAllTest();	//这里初始化一下数组，获取到所有的AllTestID的数据，用于通过AllTestID获取做题记录；
                _arrUserTest = JSON.parse(_getUserTestInfoByAlltestID());//通过接口获取做题数据；
                _jsonAllTest = G_SetTestInfo.setFavAndNoteTest(_jsonAllTest, _arrUserTest);	//添加用户笔记、收藏标记
                break;
			case 'comb':
				_jsonAllTest = _getKnowledgeTestJSON(appEName);	//获取知识宝库试题信息
				break;
			case 'myMessage':	//从个人中心我的消息进入做题页面，获取消息对应的试题信息
				var type = G_Prg.getQueryString('type');
				if(type === 'connot'){
					_jsonAllTest = _getUserConnotMessageTest(appID, curPage);
				}else{
					_jsonAllTest = _getUserMessageTest(appID, curPage);
				}
				break;
			case 'doExam-index'://随机习题
                _jsonAllTest = _getRandomPracticeTest(appID);
                _isVip = 1;
			    break;
		}
		_initArrAllTest();	//初始化结构体数组
		}
	}
	/********************************************************************************
	函数名：_initArrAllTest
	功能：初始化试题结构体数组
	输入参数: 无
	返回值：无
	创建信息：黎萍（2014-08-18）
	修改记录：黎萍（2015-11-17）添加用户答题明细
	审查人：无
	 *******************************************************************************/
	function _initArrAllTest(){
		if(_jsonAllTest === '' || !_jsonAllTest){
			return;
		}
		if(_data_KJCY !== 0){
			return;
		}
		var index = 0; //数组Numbers的索引
		//题型数据获取异常
		var styleItems = _jsonAllTest.StyleItems;
		if(styleItems.length === 0){
			G_Prg.throw('程序运行错误，TestData._initArrAllTest ：styleItems = "' + styleItems + '"，无法解析试题数据包！'); 	
		}
		for (var i = 0; i < styleItems.length; i++) {
			var testType = styleItems[i].Type; //题型
			var testItems = styleItems[i].TestItems;
			/*if(!testItems.length){
                G_Prg.throw('程序运行错误，TestData._initArrAllTest ：试题数据为空'); 	
            }*/
			for (var j = 0; j < testItems.length; j++) {
				/*
				判断试题所属题型，调用对应的读取数据的函数
				对结构体的属性进行赋值，同时生成数组的值
				 */
				if (testType === 'A3TEST') {
					var a3items = testItems[j].A3TestItems;
					/*if(!a3items.length){
						G_Prg.throw('程序运行错误，TestData._initArrAllTest ：试题数据为空'); 	
					}*/
					for (var k = 0; k < a3items.length; k++) {
						//_arrAllTest[index] = new OneTest(i, j, k, index + 1);
						var childTable = {
                            AllTestID: testItems[j].AllTestID,
                            ChildTableID: a3items[k].A3TestItemID
                        }
						_arrContrastChildTableID[index] = childTable;
						_arrAllTest[index] = new OneTest();
						_arrAllTest[index].styleItemIndex = i;
						_arrAllTest[index].testItemIndex = j;
						_arrAllTest[index].subTestItemIndex = k;
						_arrAllTest[index].testNO = index + 1;
						_arrAllTest[index].style = styleItems[i].Style;
						_arrAllTest[index].type = testType;
						_arrAllTest[index].score = styleItems[i].Score;
                        _arrContrast[index]=parseInt(testItems[j].AllTestID+''+a3items[k].A3TestItemID);
						if(a3items[k].State === 'commited'){
							_arrAllTest[index].state = a3items[k].State;
							_arrAllTest[index].userReply = a3items[k].UserAnswer;
							_arrAllTest[index].isRight = a3items[k].IsRight;

						}else{
							_arrAllTest[index].state = 'uncommited';
							_arrAllTest[index].userReply = '';
							_arrAllTest[index].isRight = false;
						}
						_arrAllTest[index].fav = a3items[k].IsFav;
						_arrAllTest[index].userNote = a3items[k].UserNoteContent;
						_arrAllTest[index].time = a3items[k].NoteTime;
						index++;
					}
				} else if (testType === 'BTEST') {
					var bitems = testItems[j].BTestItems;
					/*if(!bitems.length){
						G_Prg.throw('程序运行错误，TestData._initArrAllTest ：试题数据为空'); 	
					}*/
					for (var k = 0; k < bitems.length; k++) {
						//_arrAllTest[index] = new OneTest(i, j, k, index + 1);
						var childTable = {
                            AllTestID: testItems[j].AllTestID,
                            ChildTableID: bitems[k].BTestItemID
                        }
                        _arrContrastChildTableID[index] = childTable;
						_arrAllTest[index] = new OneTest();
						_arrAllTest[index].styleItemIndex = i;
						_arrAllTest[index].testItemIndex = j;
						_arrAllTest[index].subTestItemIndex = k;
						_arrAllTest[index].testNO = index + 1;
						_arrAllTest[index].style = styleItems[i].Style;
						_arrAllTest[index].type = testType;
						_arrAllTest[index].score = styleItems[i].Score;
                        _arrContrast[index]=parseInt(testItems[j].AllTestID+''+bitems[k].BTestItemID);
						if(bitems[k].State === 'commited'){
							_arrAllTest[index].state = bitems[k].State;
							_arrAllTest[index].userReply = bitems[k].UserAnswer;
							_arrAllTest[index].isRight = bitems[k].IsRight;

						}else{
							_arrAllTest[index].state = 'uncommited';
							_arrAllTest[index].userReply = '';
							_arrAllTest[index].isRight = false;
						}
						_arrAllTest[index].fav = bitems[k].IsFav;
						_arrAllTest[index].userNote = bitems[k].UserNoteContent;
						_arrAllTest[index].time = bitems[k].NoteTime;
						index++;
					}
				} else if (testType === 'ATEST' || testType === 'JDTEST' || testType === 'PDTEST' || testType === 'TKTEST' || testType === 'XTEST') {
					//_arrAllTest[index] = new OneTest(i, j, -1, index + 1);
					var childTable = {
                        AllTestID: testItems[j].AllTestID,
                        ChildTableID: -1
                    }
                    _arrContrastChildTableID[index] = childTable;
					_arrAllTest[index] = new OneTest();
					_arrAllTest[index].styleItemIndex = i;
					_arrAllTest[index].testItemIndex = j;
					_arrAllTest[index].testNO = index + 1;
					_arrAllTest[index].style = styleItems[i].Style;
					_arrAllTest[index].type = testType;
					_arrAllTest[index].score = styleItems[i].Score;
                    _arrContrast[index]=testItems[j].AllTestID;
					if(testItems[j].State === 'commited'){
						_arrAllTest[index].state = testItems[j].State;
						_arrAllTest[index].userReply = testItems[j].UserAnswer;
						_arrAllTest[index].isRight = testItems[j].IsRight;
					}else{
						_arrAllTest[index].state = 'uncommited';
						_arrAllTest[index].userReply = '';
						_arrAllTest[index].isRight = false;
					}
					_arrAllTest[index].fav = testItems[j].IsFav;
					_arrAllTest[index].userNote = testItems[j].UserNoteContent;
					_arrAllTest[index].time = testItems[j].NoteTime;
					index++;
				} else {
					G_Prg.throw('程序运行错误，TestData._initArrAllTest ：testType = "' + testType + '"，无法解析题型'); 
				}
			} //end for testItems
		} //end for styleItem	
	}
	/********************************************************************************
	函数名：_getEasyErrorJson
	功能：获取执业护士易混易错的试题数据
	输入参数: curPage 当前页码
	返回值：处理后的试题数组
	创建信息：黎萍（2015-05-12）
	修改记录：黎萍（2015-06-23）修改函数只返回截取后的试题数据
			  黎萍（2015-12-29）修改：在试题数据分页前进行图片替换
	 *******************************************************************************/
	function _getEasyErrorJson(curPage) {
		var testData = [];
		easyErrorData = G_SetTestInfo.replaceImgURL(easyErrorData);//设置图片路径
		var dataLen = easyErrorData.StyleItems.length;
		for (var i = 0; i < dataLen; i++) {
			if (!G_Cookie.getTestCount()) {
				_testCount = easyErrorData.TestCount;//StyleItems[i].TestItems.length;
				G_Cookie.setTestCount(_testCount);
			} else {
				_testCount = G_Cookie.getTestCount();
			}
			testData = easyErrorData.StyleItems.slice((curPage - 1) * 50, curPage * 50);//[i].TestItems.slice((curPage - 1) * 50, curPage * 50);
		}
		return testData;
	}
	/********************************************************************************
	函数名：_getAllTestJSON
	功能：通过ajax获取指定章节试题json数据
	输入参数: appID 软件ID；
             callback 抛出异常后执行的回调函数
	返回值：章节试题json数据
	创建信息：黎萍（2014-06-18）
	修改记录：黎萍（2014-06-25）软件名称和章节ID进行判断，如果为空抛出异常，同时跳出方法
	修改记录：黎萍（2014-06-26）将函数修改为TestData的私有函数
	修改记录：黎萍（2014-07-03） 增加接收数据arrUserTest ；修改status 判断
	修改记录：黎萍（2014-07-07）增加输入参数appID
             韦友爱（2014-07-23）添加参数callback
			 黎萍（2016-03-31）修改获取章节试题接口：只获取试题，用户数据info数据包单独获取
	         黎萍（2016-03-31）修改获取章节试题接口：只获取试题，用户数据info数据包单独获取
	  		 陶云（2016-07-06）重做本章节时清空统计到的已做题数，重新统计。
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getAllTestJSON(cptID,appID,callback) {
		var userID = G_Cookie.getUserID() ? G_Cookie.getUserID() : -1;
		var userName = G_Cookie.getUserName();
		var guid = G_Cookie.getGuid();	//检验码
        var params={
            appID : appID,
			cptID : cptID,
			userID : userID,
            userName : userName,
            guid : guid
        };
		var jsonData = ''; 	//试题json数据
		var arrUserTest =  '';	//存储用户收藏、用户笔记的数组
		var myRedo = Number(G_Prg.getQueryString('myRedo'));	//myRedo===1，则表示点击了重做本章按钮
		if(myRedo === 1){
			if(typeof(G_ChapterCache)!=='undefined'){
				G_ChapterCache.removeCptIDInfo(Number(cptID));
			}
			/*if(typeof(G_UserInfoCache)!=='undefined'){
				arrUserTest = G_UserInfoCache.removeUserInfoCache(cptID);
				_arrUserTest = arrUserTest;
			}*/
		}else{
			//先尝试从缓存中读取数据
			/*if(typeof(G_UserInfoCache)!=='undefined' && userID !== -1){
				arrUserTest = JSON.parse(G_UserInfoCache.getUserInfoCache(cptID));
				_arrUserTest = arrUserTest;
			}*/
			getTestFromCache(cptID,appID,callback);
			_arrUserTest = arrUserTest;
			var maxIndex = _getLastReplyTestIndex(_arrUserTest);
			if (_arrUserTest.length >= 1) {// && _arrUserTest[maxIndex].State === 'commited' //陶云去掉已做的commited拦截，使题数跳到用户浏览的题
				if (_arrUserTest[maxIndex].ChildTableID === -1) {
					_curAllTestID = _arrUserTest[maxIndex].AllTestID;
				} else {
					_curAllTestID = _arrUserTest[maxIndex].AllTestID + '' + _arrUserTest[maxIndex].ChildTableID;
				}
				_maxTestTime = _arrUserTest[maxIndex].LastReplyTime;
			}
		}
        if (!jsonData) {
            getTestFromServer(cptID, appID, callback);
            jsonData = G_SetTestInfo.replaceImgURL(jsonData);	//设置图片路径
        }
        jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData,_arrUserTest);	//添加用户笔记、收藏标记
		return jsonData;
       function getTestFromCache(cptID,appID,callback){
            //var cacheData = G_CptTestCache.getCache(userID, appID, cptID);
            //if(cacheData&&cacheData.data.jsonAllTest){//试题存在，则取info包
                //jsonData=cacheData.data.jsonAllTest;
                if(userID===-1){
                    var loadingDiv = G_Prg.$('loadingDiv');//隐藏加载框
                    if (loadingDiv) {
                        loadingDiv.style.display = 'none';
                    }
					arrUserTest = [];
                    return;//游客，不取数据包
                }
                var URL='/api/exam/getChapterTestInfo';
                var success=function(json){
                    var jsonObj = JSON.parse(json);
				    if (jsonObj.status === 200) {	//200 获取数据成功
					    //字符串转json对象
					    //jsonData = JSON.parse(jsonObj.data.test);
                          _isVip = jsonObj.data.isVip;
                          /*if (_isVip !== cacheData.isVip) {
                            jsonData = '';
                            return;
                          }*/
					    arrUserTest = jsonObj.data.info;	
					    _examHistoryID = jsonObj.data.examHistoryID;
				    }else if (jsonObj.status === 300) {	//300 连接数据库失败
						//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取用户做题数据info包',jsonObj.status+':'+jsonObj.msg);
						G_Prg.throw('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
					} else if(jsonObj.status >= 400 && jsonObj.status < 500){
						//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取用户做题数据info包',jsonObj.status+':'+jsonObj.msg);
					} else{
						//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取用户做题数据info包',jsonObj.status+':'+jsonObj.msg);
						G_Prg.throw('不能处理，TestData._getAllTestJSON:status='+jsonObj.status);
					}
                }; 
                G_AjaxApi.post(URL,params,false,success);
            //}
        } 
        function getTestFromServer(cptID,appID,callback){
			/*/api/exam/getChapterTest 此接口中包含有用户数据info包*/
            var URL='/api/exam/getChapterTestJustTest';
            var success=function(json){
                var jsonObj = JSON.parse(json);
			    if (jsonObj.status === 200) {	//200 获取数据成功
				    //字符串转json对象
				    jsonData = JSON.parse(jsonObj.data.test);
				    //arrUserTest = jsonObj.data.info;	
					_isVip = jsonObj.data.isVip;
                    _examHistoryID = jsonObj.data.examHistoryID;
			    }else if (jsonObj.status === 201) {	//201 没有数据；
				    G_Prg.throw('程序运行错误，没有您要查找的试题数据！', callback);
			    }else if (jsonObj.status === 300) {	//300 连接数据库失败
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取章节练习试题',jsonObj.status+':'+jsonObj.msg);
					G_Prg.throw('程序运行错误，TestData._getAllTestJSON,数据库获取数据异常');
				} else if(jsonObj.status >= 400 && jsonObj.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取章节练习试题',jsonObj.status+':'+jsonObj.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取章节练习试题',jsonObj.status+':'+jsonObj.msg);
					G_Prg.throw('不能处理，TestData._getAllTestJSON:status='+jsonObj.status);
				}
            };  
            G_AjaxApi.post(URL,params,false,success);     
        }
	}
	/********************************************************************************
     功能：计算获取最后一道操作试题在info包中的索引
     输入参数: userDataInfo 用户info数据包
     返回值：maxTimeIndex 用户info数据包中最后答题时间最大所在的info包数组中的索引
     最后修改人：黎萍（2016-4-7）
				黎萍（2016-05-27）添加判断：进行日期格式化前，先检验日期是否已被格式化过，否则进行日期格式化
     修改内容：无
     ********************************************************************************/
    function _getLastReplyTestIndex(userDataInfo){
		var dataLen = userDataInfo.length;
		if(dataLen === 0){
			return;
		}
		var maxTime = userDataInfo[0].LastReplyTime;
		if(maxTime){
			if(!checkDate(maxTime)){
				maxTime = G_Prg.datetimeFormat(new Date(maxTime), 'yyyy-MM-dd hh:mm:ss');
			}
		}
		var maxTimeIndex = 0;
		for(var i = 1; i < dataLen;i++){
			var dateTime = userDataInfo[i].LastReplyTime;
			if(dateTime){
				if(!checkDate(dateTime)){
					dateTime = G_Prg.datetimeFormat(new Date(dateTime), 'yyyy-MM-dd hh:mm:ss');
				}
			}
			if(!dateTime && !maxTime){
				maxTimeIndex = 0;
			}
			if((dateTime >= maxTime) && (dateTime || maxTime)){
				maxTime = dateTime;
				maxTimeIndex = i;
			}
		}
		return maxTimeIndex;
		//检验日期是否已格式化
		function checkDate(dateTime){
			var dateTimeArr = dateTime.split(' ');
			var reg = /^(\d{4})-(0\d{1}|1[0-2])-(0\d{1}|[12]\d{1}|3[01])$/;
			if(reg.test(dateTimeArr[0])){
				return true;
			}
			return false;
			
		}
	}
	/********************************************************************************
     功能：获取执业护士考前预测的试题
     输入参数: cptID 章节id,appID 软件id,callback 回调函数
     返回值：maxTimeIndex 用户info数据包中最后答题时间最大所在的info包数组中的索引
     最后修改人：黎萍（2016-5-12）
     修改内容：无
     ********************************************************************************/
	function _getForecastTest(cptID,appID,callback) {
		var userID = G_Cookie.getUserID() ? G_Cookie.getUserID() : -1;
		var userName = G_Cookie.getUserName();
		var guid = G_Cookie.getGuid();	//检验码
        var params={
            appID : appID,
			cptID : cptID,
			userID : userID,
            userName : userName,
            guid : guid
        };
		var jsonData = ''; 	//试题json数据
		var URL='/api/exam/getForecastTest';
		var success=function(json){
			var jsonObj = JSON.parse(json);
			if (jsonObj.status === 200) {	//200 获取数据成功
				jsonData = JSON.parse(jsonObj.data.test);
				_isVip = jsonObj.data.isVip;
				_examHistoryID = jsonObj.data.examHistoryID;
			}else if (jsonObj.status === 201) {	//201 没有数据；
				G_Prg.throw('程序运行错误，没有您要查找的试题数据！', callback);
			}else if (jsonObj.status === 300) {	//300 连接数据库失败
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取执业护士考前预测试题',jsonObj.status+':'+jsonObj.msg);
				G_Prg.throw('程序运行错误，TestData._getForecastTest,数据库获取数据异常');
			} else if(jsonObj.status >= 400 && jsonObj.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取执业护士考前预测试题',jsonObj.status+':'+jsonObj.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取执业护士考前预测试题',jsonObj.status+':'+jsonObj.msg);
				G_Prg.throw('不能处理，TestData._getForecastTest:status='+jsonObj.status);
			}
		};  
		G_AjaxApi.post(URL,params,false,success);  
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);	//设置图片路径
		return jsonData;
	}
	/********************************************************************************
	函数名：_getMockExamJson
	功能：获取模拟考场的随机的试题数据
	输入参数:appEName 软件英文名称
	返回值：jsonData 随机生成的试题数据
	创建信息：黎萍（2014-07-23）
	 修改记录：陶云（2016-3-22）添加会计从业保过版和押题班判断
	审查人：无
	*******************************************************************************/
	function _getMockExamJson(appID,appEName){
		var guid = G_Cookie.getGuid();	//检验码
		var userID = G_Cookie.getUserID();
        if(!userID){
            G_Prg.throw('程序运行错误，testData._getMockExamJson：userID='+userID);
        }
		var userName = G_Cookie.getUserName();
		var configID = G_Prg.getQueryString('configID');
		var simulated = G_Prg.getQueryString('simulated');
		var defaulted = G_Prg.getQueryString('defaulted');
		_configJson = G_Storage.getSessionStorageValue('ConfigJSON');
		// _configJson = sessionStorage.getItem(name)
		var jsonData = ''; 	//试题json数据
		var success = function (json) {
			var jsonObj = JSON.parse(json);
			if (jsonObj.status === 200) {	//200 获取数据成功
				//字符串转json对象
				if(simulated === '0'){
					jsonData = JSON.parse(jsonObj.data.test);	
				}else if(simulated === '1'){
					jsonData = jsonObj.data.test;
				}
				_examHistoryID = jsonObj.data.examHistoryID;
			}else if (jsonObj.status === 202) {	
				G_Prg.throw('该功能充值后才能使用！', function () {
					window.location.href = '/doExam-index';
				}); 
			}else if (jsonObj.status === 300) {	//300 连接数据库失败
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取模拟考场试题',jsonObj.status+':'+jsonObj.msg);
				G_Prg.throw('程序运行错误，TestData._getMockExamJson,数据库获取数据异常');
			} else if(jsonObj.status >= 400 && jsonObj.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取模拟考场试题',jsonObj.status+':'+jsonObj.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取模拟考场试题',jsonObj.status+':'+jsonObj.msg);
				G_Prg.throw('不能处理，TestData._getMockExamJson:status='+jsonObj.status);
			}
		};
		if(simulated === '0'){	//用户没有配置过，用户首次进入模拟考场，然后点击了“开始考试”，调用后面默认配置接口获取试题
			G_AjaxApi.get('/api/exam/getSimulationTest/'+appEName +'/'+userID+'/'+ userName +'/'+ guid,false,success);
		}else if(simulated === '1'){
			//从SessionStorage中无法拿到配置JSON时，需要从数据库中获取
			if(!_configJson){
				if(!configID){
					return;	
				}
				if(defaulted === '1'){
					if(configID.indexOf(',') >= 0){
						//_configIDArr = configID.split(',');
						configID = _configIDArr[_configIDArrIndex];
					}
					G_AjaxApi.get('/api/exam/getConfigJson/'+ configID,false,function (json) {
						var jsonObj = JSON.parse(json);
						if (jsonObj.status === 200) {	//200 获取数据成功
							_configJson = jsonObj.data.configJson;
						}else if (jsonObj.status === 300) {	//300 连接数据库失败
							//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取模拟考场配置',jsonObj.status+':'+jsonObj.msg);
							G_Prg.throw('程序运行错误，TestData._getMockExamJson,数据库获取数据异常');
						} else if(jsonObj.status >= 400 && jsonObj.status < 500){
							//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取模拟考场配置',jsonObj.status+':'+jsonObj.msg);
						} else{
							//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取模拟考场配置',jsonObj.status+':'+jsonObj.msg);
							G_Prg.throw('不能处理，TestData._getMockExamJson:status='+jsonObj.status);
						}
					});	
				}else{
					G_AjaxApi.get('/api/exam/getConfigJson/'+ configID +'/'+ appEName +'/'+ userID +'/'+ guid,false,function (json) {
						var jsonObj = JSON.parse(json);
						if (jsonObj.status === 200) {	//200 获取数据成功
							_configJson = jsonObj.data.configJson;
						}else if (jsonObj.status === 300) {	//300 连接数据库失败
							//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取模拟考场配置2',jsonObj.status+':'+jsonObj.msg);
							G_Prg.throw('程序运行错误，TestData._getMockExamJson,数据库获取数据异常');
						} else if(jsonObj.status >= 400 && jsonObj.status < 500){
							//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取模拟考场配置2',jsonObj.status+':'+jsonObj.msg);
						} else{
							//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取模拟考场配置2',jsonObj.status+':'+jsonObj.msg);
							G_Prg.throw('不能处理，TestData._getMockExamJson:status='+jsonObj.status);
						}
					});	
				}//end if defaulted
			}//end if _configJson
			var params = {
				simulationExamJson : _configJson,
				appID : appID,
				userID : userID,
				userName : userName,
				guid : guid
				};	
			if(defaulted === '1'){
				G_AjaxApi.post('/api/exam/getDefaultSimulationTest/',params,false,success);
			}else{
				G_AjaxApi.post('/api/exam/getSimulationTest/',params,false,success);
			}	
		}//end if simulated
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);	//设置图片路径
		if(appEName === 'CJ_KJCY_DSHYY'||appEName === 'CJ_KJCY_DSHYY_BGB'||appEName === 'CJ_KJCY_DSHYY_YTB'){
			jsonData = G_SetTestInfo.sortingTest(jsonData);
		}
		return jsonData;
	}
	/********************************************************************************
	函数名：_getCacheData
	功能：从缓存中获取指定模拟考场配置试题数据、答题信息数据
	输入参数:无
	返回值：jsonData 指定配置试题数据
	创建信息：黎萍（2016-03-01）
	 修改记录：陶云（2016-3-22）添加会计从业保过版和押题班判断
	审查人：无
	*******************************************************************************/
	function _getCacheData(){
		var appENameArr = ['CJ_KJCY_DSHYY_BGB','CJ_KJCY_DSHYY_YTB'];
		var appEName = G_Cookie.getAppEName();
		if(appENameArr.indexOf(appEName) === -1){//非会计从业押题版、保过版不需要执行函数
			return 0;
		}

		var configID = G_Prg.getQueryString('configID');
		if(configID.indexOf(',') >= 0 && _configIDArr.length === 0){
			_configIDArr = configID.split(',');
		}
		if(!G_Prg.getCookie('CONFIGID_INDEX')){
			_configIDArrIndex = 0;
		}else{
			_configIDArrIndex = Number(G_Prg.getCookie('CONFIGID_INDEX'));
		}
		//表明是最后一套试卷进入取题，则从缓存获取第一套试卷数据
		//如果最后一套试卷的试题数据存在本地缓存，则模拟考场数据从缓存获取
		var userID = G_Cookie.getUserID();
		var keyName = userID+'_simulatedTestJson_'+(_configIDArr.length-1);
		if(G_Storage.isExistLocalStorageKey(keyName)){
			if(_configIDArrIndex === _configIDArr.length){
				_configIDArrIndex = 0;
			}
			var cacheJson = G_Storage.getLocalStorageValue(userID+'_simulatedTestJson_'+_configIDArrIndex);
			return cacheJson;
		}else{
			return 0;
		}
	}
	/********************************************************************************
	函数名：_getSearchExamJson
	功能：获取被查找的试题数据
	输入参数:appEName 软件英文名称;curPage 当前页码
             callback 抛出异常后执行的回调函数
	返回值：jsonData 查找到的试题数据
	创建信息：黎萍（2014-08-7）
	修改记录：无
	审查人：无
	*******************************************************************************/
	function _getSearchExamJson(appEName,curPage,callback){
		var userName = G_Cookie.getUserName();
        var userID = G_Cookie.getUserID();
        if (!userID) {
 			G_Prg.throw('程序运行错误，TestData._getSearchExamJson : userID = "'+userID+'",获取数据出现异常');
 		}
		var guid = G_Cookie.getGuid();	//检验码
		var keyWord = G_Prg.getQueryString('keyWord',true);
		var testJsonData = ''; 	//试题json数据
        var URL = '/api/searchTest/getTestByTestKeyApi';
        var params={
            appEName:appEName,
            keyWord:keyWord,
            curPage:curPage-1,
            userID:userID,
            userName:userName,
            guid:guid
        };
 		var _success = function (json) {
 			if (!json) {
 				G_Prg.throw('程序运行错误，TestData._getSearchExamJson请求服务器无返回');
 			}
 			var jsonData = JSON.parse(json);
 			if (jsonData.status === 200) {
 				testJsonData = jsonData.data.test;
				_examHistoryID = jsonData.data.examHistoryID;
 			} else if (jsonData.status === 201) { //用户尚未有收藏题目，查询不到数据
 				G_Prg.throw('没有所要查找的试题', callback);
 			} else if (jsonData.status === 300) { //数据库错误
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取查找试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，TestData._getSearchExamJson,数据库获取数据异常', callback);
			} else if(jsonData.status >= 400 && jsonData.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取查找试题',jsonData.status+':'+jsonData.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取查找试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('不能处理，TestData._getSearchExamJson:status='+jsonData.status,callback);
			}
 		} 
 		G_AjaxApi.post(URL,params, false, _success);
 		testJsonData = G_SetTestInfo.replaceImgURL(testJsonData); //设置图片路径
 		return testJsonData;
	}
    /********************************************************************************
	函数名：_getNotDoneJson
	功能：获取用户未做的试题数据
	输入参数:appID 软件ID, cptID 章节ID,
             callback 抛出异常后执行的回调函数
	返回值：jsonData 未做的试题数据
	创建信息：韦友爱（2014-08-25）
	修改记录：无
	审查人：无
	*******************************************************************************/
    function _getNotDoneJson(appID, cptID, callback){
        var userID = G_Cookie.getUserID();
        if (!userID) {
 			G_Prg.throw('程序运行错误，TestData._getNotDoneJson : userID = "'+userID+'",获取数据出现异常');
 		}
        var userName = G_Cookie.getUserName();
        if (!userName) {
 			G_Prg.throw('程序运行错误，TestData._getNotDoneJson : userName = "'+userName+'",获取数据出现异常');
 		}
        var guid = G_Cookie.getGuid();
        if (!guid) {
 			G_Prg.throw('程序运行错误，TestData._getNotDoneJson : guid = "'+guid+'",获取数据出现异常');
 		}
		var jsonData = ''; 	//试题json数据
		var arrUserTest =  '';	//存储用户收藏、用户笔记的数组
        var URL='/api/analysistApi/getNotDoTests/'+appID+'/'+userID+'/'+cptID+'/'+userName+'/'+guid;
        var _success=function (json) {
				var jsonObj = JSON.parse(json);
				if (jsonObj.status === 200) {	//200 获取数据成功
					//字符串转json对象
					jsonData = JSON.parse(jsonObj.data.test);
					arrUserTest = jsonObj.data.info;	
					_isVip = jsonObj.data.isVip;
					_examHistoryID = jsonObj.data.examHistoryID;
				}else if (jsonObj.status === 201) {	//201 没有数据；
					G_Prg.throw('程序运行错误，没有您未做的试题数据！', callback);
				}else if (jsonObj.status === 300) {	//300 连接数据库失败
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取未答试题',jsonData.status+':'+jsonData.msg);
					G_Prg.throw('程序运行错误，TestData._getNotDoneJson,数据库获取数据异常', callback);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取未答试题',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取未答试题',jsonData.status+':'+jsonData.msg);
					G_Prg.throw('不能处理，TestData._getNotDoneJson:status='+jsonData.status,callback);
				}
			};
        G_AjaxApi_Record.get(URL,false,_success);
		jsonData = G_SetTestInfo.setFavAndNoteTest(jsonData,arrUserTest);	//添加用户笔记、收藏标记
		jsonData = G_SetTestInfo.replaceImgURL(jsonData);	//设置图片路径
		return jsonData;
    }
	/********************************************************************************
	函数名：_getFavTestJson
	功能：获取用户收藏的试题数据
	输入参数:appID 软件ID,appEName 软件英文名称,curPage 当前页码
             callback 抛出异常后执行的回调函数           
	返回值：favTestJson 被收藏的试题数据
	创建信息：黎萍（2014-07-04）
	修改记录：黎萍（2014-07-07）增加输入参数appID,appEName
	修改记录：黎萍（2014-07-14）增加输入参数curPage 当前页码
              韦友爱（2014-07-23）添加参数callback
	审查人：无
	*******************************************************************************/
	function _getFavTestJson(appID,appEName,curPage,cptID,testNum,callback) {
		var userID = G_Cookie.getUserID();
		if (!userID) {
 			G_Prg.throw('程序运行错误，TestData._getFavTestJson : userID = "'+userID+'",获取数据出现异常');
 		}
		var favTestJson = {};
		var arrUserTest =  '';	//存储用户收藏、用户笔记的数组
 		var _success = function (json) {
 			var jsonData = JSON.parse(json);
 			if (jsonData.status === 200) {
 				//接收数据
 				favTestJson = jsonData.data.test;
				arrUserTest = jsonData.data.info;	
				_examHistoryID = jsonData.data.examHistoryID;
 			}else if (jsonData.status === 201) {
				G_Prg.throw('无收藏记录！');
 			} else if (jsonData.status === 202) { //部分试题查询不到
 				favTestJson = jsonData.data.test;
 				if (favTestJson.StyleItems.length===0) {
 					G_Prg.throw('程序运行错误，testData._getFavTestJson:status ='+jsonData.status+' 没有查询到收藏试题数据！');
 				}
                G_Prg.alert('由于考试大纲变化，题库更新，部分超纲试题不再显示，如您发现小部分题目减少，属正常现象。');
 				arrUserTest = jsonData.data.info;
                _examHistoryID = jsonData.data.examHistoryID;
			}else if (jsonData.status === 300) { //数据库错误
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取我的收藏试题',jsonData.status+':'+jsonData.msg);
 				G_Prg.throw('程序运行错误，TestData._getFavTestJson,数据库获取数据异常');
 			} else if(jsonData.status >= 400 && jsonData.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取我的收藏试题',jsonData.status+':'+jsonData.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取我的收藏试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('不能处理，TestData._getFavTestJson:status='+jsonData.status);
			}
 		}
        var URL = '/api/exam/getUserFav';
        var params={
            appID:appID,
            userID:userID,
            appEName:appEName,
            curPage:curPage-1,
            userName:G_Cookie.getUserName(),
            guid:G_Cookie.getGuid(),
            cptID:cptID,
            eachPageNum:testNum
        };
		G_AjaxApi_Record.post(URL, params, false, _success);
        
		favTestJson = G_SetTestInfo.setFavAndNoteTest(favTestJson,arrUserTest);	//添加用户笔记、收藏标记
		favTestJson = G_SetTestInfo.replaceImgURL(favTestJson);	//设置图片路径
        favTestJson = G_SetTestInfo.sortingTest(favTestJson);//按题型重组json
 		return favTestJson;
 	}
    /********************************************************************************
	函数名：_getFavRankJson
	功能：获取收藏排行的试题数据
	输入参数:appID 软件ID,appEName 软件英文名称,curPage 当前页码，userName 用户名，userID 用户ID        
	返回值：favRankJson 收藏排行的试题数据
	创建信息：韦友爱（2014-08-20）
	审查人：无
	*******************************************************************************/
	function _getFavRankJson(appID, appEName, curPage, testNum, callback) {
        var userID = G_Cookie.getUserID();
		if (!userID) {
 			G_Prg.throw('程序运行错误，TestData._getFavRankJson : userID = "'+userID+'",获取数据出现异常'); 
 		}
        var userName = G_Cookie.getUserName();
		if (!userName) {
 			G_Prg.throw('程序运行错误，TestData._getFavRankJson : userName = "'+userName+'",获取数据出现异常');
 		}
		var favRankJson = {};
		var arrUserTest = ''; //存储用户收藏、用户笔记的数组
		var _success = function (json) {
			var jsonData = JSON.parse(json);
			if (jsonData.status === 200) {
				//接收数据
				favRankJson = jsonData.data.test;
				arrUserTest = jsonData.data.info;
				_examHistoryID = jsonData.data.examHistoryID;
			} else if (jsonData.status === 201) {
				G_Prg.throw('无收藏排行榜数据！');
			} else if (jsonData.status === 202) { //部分试题查询不到
				favRankJson = jsonData.data.test;
				if (favTestJson.StyleItems.length === 0) {
					G_Prg.throw('程序运行错误，TestData._getFavRankJson:status =' + jsonData.status + ' 没有查询到收藏排行榜试题数据！');
				}
				G_Prg.alert('由于考试大纲变化，题库更新，部分超纲试题不再显示，如您发现小部分题目减少，属正常现象。');
				arrUserTest = jsonData.data.info;
				_examHistoryID = jsonData.data.examHistoryID;
			} else if (jsonData.status === 300) { //数据库错误
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取收藏排行榜试题',jsonData.status+':'+jsonData.msg);
 				G_Prg.throw('程序运行错误，TestData._getFavRankJson,数据库获取数据异常');
 			} else if(jsonData.status >= 400 && jsonData.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取收藏排行榜试题',jsonData.status+':'+jsonData.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取收藏排行榜试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('不能处理，TestData._getFavRankJson:status='+jsonData.status);
			}
		}
		var URL = '/api/testRank/getFavRankTest';
        var params={
            appID:appID,
            userID:userID,
            appEName:appEName,
            curPage:curPage-1,
            userName:userName,
            guid:G_Cookie.getGuid(),
            cptID:-1,
            eachPageNum:testNum
        };
		G_AjaxApi.post(URL, params, false, _success);
        favRankJson = G_SetTestInfo.setFavAndNoteTest(favRankJson,arrUserTest);	//添加用户笔记、收藏标记
		favRankJson = G_SetTestInfo.replaceImgURL(favRankJson); //设置图片路径
        favRankJson = G_SetTestInfo.sortingTest(favRankJson);//按题型重组json
		return favRankJson;
	}
	/********************************************************************************
	函数名：_getErrorTestJson
	功能：获取用户做错的试题数据
	输入参数:appID 软件ID,appEName 软件英文名称,curPage 当前页码
            callback 抛出异常后执行的回调函数
	返回值：errorTestJson 被做错的试题数据
	创建信息：黎萍（2014-07-04）
	修改记录：黎萍（2014-07-07）增加输入参数appID,appEName
	修改记录：黎萍（2014-07-14）增加输入参数curPage 当前页码
             韦友爱（2014-07-23）添加参数callback
	审查人：无
	*******************************************************************************/
	function _getErrorTestJson(appID,appEName,curPage,cptID,testNum,callback) {
		var userID = G_Cookie.getUserID();
		if (!userID) {
 			G_Prg.throw('程序运行错误，TestData._getErrorTestJson : userID = "'+userID+'",获取数据出现异常'); 
 		}
		var errorTestJson = {};
		var arrUserTest =  '';	//存储用户收藏、用户笔记的数组
 		var _success = function (json) {
 			var jsonData = JSON.parse(json);
 			if (jsonData.status === 200) {
 				//接收数据
 				errorTestJson = jsonData.data.test;
				arrUserTest = jsonData.data.info;
				_examHistoryID = jsonData.data.examHistoryID;
 			}else if (jsonData.status === 201) {
				G_Prg.throw('无错题记录！');
 			} else if (jsonData.status === 202) { //部分试题查询不到
 				errorTestJson = jsonData.data.test;
 				if (errorTestJson.StyleItems.length===0) {
 					G_Prg.throw('程序运行错误，testData._getErrorTestJson:status= '+jsonData.status+' 没有查找到做错的试题数据！');
 				}
                G_Prg.alert('由于考试大纲变化，题库更新，部分超纲试题不再显示，如您发现小部分题目减少，属正常现象。');
 				arrUserTest = jsonData.data.info;
                _examHistoryID = jsonData.data.examHistoryID;
 			} else if (jsonData.status === 300) { //数据库错误
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取我的错题试题',jsonData.status+':'+jsonData.msg);
 				G_Prg.throw('程序运行错误，TestData._getErrorTestJson,数据库获取数据异常');
 			} else if(jsonData.status >= 400 && jsonData.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取我的错题试题',jsonData.status+':'+jsonData.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取我的错题试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('不能处理，TestData._getErrorTestJson:status='+jsonData.status);
			}
 		}
        var URL = '/api/exam/getErrorTest';
        var params={
            appID:appID,
            userID:userID,
            appEName:appEName,
            curPage:curPage-1,
            userName:G_Cookie.getUserName(),
            guid:G_Cookie.getGuid(),
            cptID:cptID,
            eachPageNum:testNum
        };
    	G_AjaxApi_Record.post(URL, params, false, _success);
        
		errorTestJson = G_SetTestInfo.setFavAndNoteTest(errorTestJson,arrUserTest);	//添加用户笔记、收藏标记
		errorTestJson = G_SetTestInfo.replaceImgURL(errorTestJson);	//设置图片路径
        errorTestJson = G_SetTestInfo.sortingTest(errorTestJson);//按题型重组json
 		return errorTestJson;
 	}
    /********************************************************************************
	函数名：_getErrorRankJson
	功能：获取错题排行榜的试题数据
	输入参数:appID 软件ID, appEName 软件英文名, curPage 当前页码，userName 用户名，userID 用户ID
	返回值：errorRankJson 错题排行榜的试题数据
	创建信息：韦友爱（2014-09-16）
	修改记录：无
	审查人：无
	*******************************************************************************/
    function _getErrorRankJson(appID, appEName, curPage, testNum,callback) {
        var userID = G_Cookie.getUserID();
		if (!userID) {
 			G_Prg.throw('程序运行错误，TestData._getErrorRankJson : userID = "'+userID+'",获取数据出现异常'); 
 		}
        var userName = G_Cookie.getUserName();
		if (!userName) {
 			G_Prg.throw('程序运行错误，TestData._getErrorRankJson : userName = "'+userName+'",获取数据出现异常');
 		}
    	var errorRankJson = {};
    	var arrRankTest = ''; //存储用户收藏、用户笔记的数组
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
    			//接收数据
    			errorRankJson = jsonData.data.test;
    			arrRankTest = jsonData.data.info;
                _examHistoryID = jsonData.data.examHistoryID;
    		} else if (jsonData.status === 201) {
    			G_Prg.throw('无错题排行榜记录！');
    		} else if (jsonData.status === 202) { //部分试题查询不到
    			errorRankJson = jsonData.data.test;
    			if (errorRankJson.StyleItems.length === 0) {
    				G_Prg.throw('程序运行错误，TestData._getErrorRankJson:status= ' + jsonData.status + ' 没有查找到错题排行榜的试题数据！');
    			}
    			G_Prg.alert('由于考试大纲变化，题库更新，部分超纲试题不再显示，如您发现小部分题目减少，属正常现象。');
    			arrRankTest = jsonData.data.info;
    			_examHistoryID = jsonData.data.examHistoryID;
    		} else if (jsonData.status === 300) { //数据库错误
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取错题排行榜试题',jsonData.status+':'+jsonData.msg);
 				G_Prg.throw('程序运行错误，TestData._getErrorRankJson,数据库获取数据异常');
 			} else if(jsonData.status >= 400 && jsonData.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取错题排行榜试题',jsonData.status+':'+jsonData.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取错题排行榜试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('不能处理，TestData._getErrorRankJson:status='+jsonData.status);
			}
    	}
    	var URL = '/api/testRank/getErrorRankTest';
        var params={
            appID:appID,
            userID:userID,
            appEName:appEName,
            curPage:curPage-1,
            userName:userName,
            guid:G_Cookie.getGuid(),
            eachPageNum:testNum
        };
    	G_AjaxApi.post(URL, params, false, _success);
    	errorRankJson = G_SetTestInfo.setFavAndNoteTest(errorRankJson, arrRankTest); //添加用户笔记、收藏标记
    	errorRankJson = G_SetTestInfo.replaceImgURL(errorRankJson); //设置图片路径
        errorRankJson = G_SetTestInfo.sortingTest(errorRankJson);       
    	return errorRankJson;
    }
	/********************************************************************************
	函数名：_getTestNoteJson
	功能：获取用户笔记的试题数据
	输入参数:appID 软件ID,appEName 软件英文名称,curPage 当前页码
            callback 抛出异常后执行的回调函数
	返回值：noteTestJson 用户笔记的试题数据
	创建信息：黎萍（2014-07-06）
	修改记录：黎萍（2014-07-07）增加输入参数appID,appEName
	修改记录：黎萍（2014-07-14）增加输入参数curPage 当前页码
             韦友爱（2014-07-23）添加参数callback
	审查人：无
	*******************************************************************************/
	function _getTestNoteJson(appID,appEName,curPage,cptID,testNum,callback) {
		var userID = G_Cookie.getUserID();
		if (!userID) {
 			G_Prg.throw('程序运行错误，TestData._getTestNoteJson : userID = "'+userID+'",获取数据出现异常'); 
 		}
 		var noteTestJson = {};
		var arrUserTest =  '';	//存储用户收藏、用户笔记的数组
 		var _success = function (json) {
 			var jsonData = JSON.parse(json);
 			if (jsonData.status === 200) {
 				//接收数据
 				noteTestJson = jsonData.data.test;
				arrUserTest = jsonData.data.info;
				_examHistoryID = jsonData.data.examHistoryID;
 			}else if (jsonData.status === 201) {
				G_Prg.throw('无笔记记录！');
 			} else if (jsonData.status === 202) { //部分试题查询不到
 				noteTestJson = jsonData.data.test;
 				if (noteTestJson.StyleItems.length===0) {
 					G_Prg.throw('程序运行错误，testData._getTestNoteJson:status= '+jsonData.status+' 未查询到笔记试题数据！');
 				}
                G_Prg.alert('由于考试大纲变化，题库更新，部分超纲试题不再显示，如您发现小部分题目减少，属正常现象。');
 				arrUserTest = jsonData.data.info;
                _examHistoryID = jsonData.data.examHistoryID;
 			} else if (jsonData.status === 300) { //数据库错误
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取我的笔记试题',jsonData.status+':'+jsonData.msg);
 				G_Prg.throw('程序运行错误，TestData._getTestNoteJson,数据库获取数据异常');
 			} else if(jsonData.status >= 400 && jsonData.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取我的笔记试题',jsonData.status+':'+jsonData.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取我的笔记试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('不能处理，TestData._getTestNoteJson:status='+jsonData.status);
			}
 		}
        var URL = '/api/exam/getUserNoteTest';
        var params={
            appID:appID,
            userID:userID,
            appEName:appEName,
            curPage:curPage-1,
            userName:G_Cookie.getUserName(),
            guid:G_Cookie.getGuid(),
            cptID:cptID,
            eachPageNum:testNum
        };
 		G_AjaxApi_Record.post(URL, params, false, _success);

		noteTestJson = G_SetTestInfo.setFavAndNoteTest(noteTestJson,arrUserTest);	//添加用户笔记、收藏标记
		noteTestJson = G_SetTestInfo.replaceImgURL(noteTestJson);	//设置图片路径
        noteTestJson = G_SetTestInfo.sortingTest(noteTestJson);//按题型重组json
 		return noteTestJson;
 	}
    /********************************************************************************
	函数名：_getNoteRankJson
	功能：获取用户笔记的试题数据
	输入参数:appID 软件ID,appEName 软件英文名称,curPage 当前页码
            callback 抛出异常后执行的回调函数
	返回值：noteTestJson 用户笔记的试题数据
	创建信息：韦友爱（2014-09-24）
	修改记录：无
	审查人：无
	*******************************************************************************/
    function _getNoteRankJson(appID,appEName,curPage,testNum,callback){
        var noteTestJson = {};
		var arrUserTest =  '';	//存储用户收藏、用户笔记的数组
 		var _success = function (json) {
 			var jsonData = JSON.parse(json);
 			if (jsonData.status === 200) {
                //接收数据
 				noteTestJson = jsonData.data.test;
				arrUserTest = jsonData.data.info;
				_examHistoryID = jsonData.data.examHistoryID;
 			}else if (jsonData.status === 201) {
				G_Prg.throw('无大家的笔记记录！');
 			} else if (jsonData.status === 202) { //部分试题查询不到
 				noteTestJson = jsonData.data.test;
 				if (noteTestJson.StyleItems.length===0) {
 					G_Prg.throw('程序运行错误，testData._getTestNoteJson:status= '+jsonData.status+' 未查询到笔记试题数据！');
 				}
                G_Prg.alert('由于考试大纲变化，题库更新，部分超纲试题不再显示，如您发现小部分题目减少，属正常现象。');
 				arrUserTest = jsonData.data.info;
                _examHistoryID = jsonData.data.examHistoryID;
 			} else if (jsonData.status === 300) { //数据库错误
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取大家的笔记试题',jsonData.status+':'+jsonData.msg);
 				G_Prg.throw('程序运行错误，TestData._getTestNoteJson,数据库获取数据异常');
 			} else if(jsonData.status >= 400 && jsonData.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取大家的笔记试题',jsonData.status+':'+jsonData.msg);
			} else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取大家的笔记试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('不能处理，TestData._getTestNoteJson:status='+jsonData.status);
			}
 		}
 		var URL = '/api/latestNotes/getLatestNotes';
        var params={
            appID:appID,
            appEName:appEName,
            curPage:curPage-1,
            userName:G_Cookie.getUserName(),
            userID:G_Cookie.getUserID(),
            guid:G_Cookie.getGuid(),
            eachPageNum:testNum,
            latestTime:G_Prg.getQueryString('time')
        };
 		G_AjaxApi_Record.post(URL, params, false, _success);
        noteTestJson = G_SetTestInfo.setFavAndNoteTest(noteTestJson,arrUserTest);	//添加用户笔记、收藏标记
		noteTestJson = G_SetTestInfo.replaceImgURL(noteTestJson);	//设置图片路径
        noteTestJson = G_SetTestInfo.sortingTest(noteTestJson);//按题型重组json
 		return noteTestJson;
    }
	/********************************************************************************
     功能：根据知识点章节获取该章节试题数据
     输入参数:appEName 软件英文名称
     返回值：knowledgeTestJson 知识点章节试题数据
     最后修改人：黎萍（2016-1-27）
     修改内容：无
     ********************************************************************************/
	function _getKnowledgeTestJSON(appEName){
        var userName = G_Cookie.getUserName();
		if (!userName) {
 			G_Prg.throw('程序运行错误，TestData._getKnowledgeTestJSON : userName = "'+userName+'",获取数据出现异常');
 		}
		var cptID = G_Prg.getCookie('KNOWLESGECPTID');
		if (!cptID) {
 			G_Prg.throw('程序运行错误，TestData._getKnowledgeTestJSON : cptID = "'+cptID+'",获取数据出现异常');
 		}
		var knowledgeTestJson = {};
		var arrUserTest = ''; //存储用户收藏、用户笔记的数组
		var params={
			appID : G_Cookie.getAppID(),
			cptID : cptID,
			userID :  G_Cookie.getUserID(),
			userName : userName,
			guid : G_Cookie.getGuid()
		};
		var _success = function (json) {
			var jsonData = JSON.parse(json);
			if (jsonData.status === 200) {
				//接收数据
				_isVip = jsonData.data.isVip;
				knowledgeTestJson = JSON.parse(jsonData.data.test);
				arrUserTest = jsonData.data.info;
				_examHistoryID = jsonData.data.examHistoryID;
			} else if (jsonData.status === 201) {
				G_Prg.throw('无知识点章节试题数据！');
			} else if (jsonData.status === 300) { //数据库错误
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取知识点试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('程序运行错误，TestData._getKnowledgeTestJSON,数据库获取数据异常');
			} else if(jsonData.status >= 400 && jsonData.status < 500){
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取知识点试题',jsonData.status+':'+jsonData.msg);
			}  else {
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取知识点试题',jsonData.status+':'+jsonData.msg);
				G_Prg.throw('不能处理，TestData._getKnowledgeTestJSON:status=' + jsonData.status);
			}
		}
		var URL = '/api/exam/getChapterTest';
		G_AjaxApi.post(URL, params,false, _success);
		knowledgeTestJson = G_SetTestInfo.replaceImgURL(knowledgeTestJson); //设置图片路径
		return knowledgeTestJson;
	}
	/********************************************************************************
     功能：根据知识点ID获取对应的试题数据
     输入参数:无
     返回值：knowledgeTestJson 知识点章节试题数据
     最后修改人：黎萍（2016-7-28）
     修改内容：无
     ********************************************************************************/
    function _getKnowledgeTestJSON2() {
        var knowledgeID = G_Prg.getQueryString('knowledgeID');
        var knowledgeTestJson = {};
        var arrUserTest = ''; //存储用户收藏、用户笔记的数组.
        var _success = function (json) {
            var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                //接收数据
                _isVip = jsonData.data.isVip;
                knowledgeTestJson = jsonData.data.test;
                arrUserTest = jsonData.data.info;
                _examHistoryID = jsonData.data.examHistoryID;
            } else if (jsonData.status === 201) {
                G_Prg.throw('无知识点章节试题数据！');
            } else if (jsonData.status === 300) { //数据库错误
                G_maiDian.setBugRecordInfos('程序错误', '做题页面——获取知识点试题', jsonData.status + ':' + jsonData.msg);
                G_Prg.throw('程序运行错误，TestData._getKnowledgeTestJSON2,数据库获取数据异常');
            } else if (jsonData.status >= 400 && jsonData.status < 500) {
                G_maiDian.setBugRecordInfos('业务逻辑错误', '做题页面——获取知识点试题', jsonData.status + ':' + jsonData.msg);
            } else {
                G_maiDian.setBugRecordInfos('其它程序错误', '做题页面——获取知识点试题', jsonData.status + ':' + jsonData.msg);
                G_Prg.throw('不能处理，TestData._getKnowledgeTestJSON2:status=' + jsonData.status);
            }
        }
        var guid = G_Cookie.getGuid();
        var URL = '/api/knowledge/getKnowledgeByID?KnowledgeID=' + knowledgeID + '&guid=' + guid;
        G_AjaxApiVideo_OSS.get(URL, false, _success);
        knowledgeTestJson = G_SetTestInfo.replaceImgURL(knowledgeTestJson); //设置图片路径
        return knowledgeTestJson;
    }

    /********************************************************************************
     函数：_getUserTestInfoByAlltestID
     功能：根据试题的AlltestID_ChildtableId数组去获取用户做题信息[{大题ID, 小题ID}],如[{"AllTestID": 1,"ChildTableID"：-1}]
     输入参数:无
     返回值：testInfobyAlltestId 通过alltestId获取到的做题信息
     最后修改人：陶云（2016-9-22）
     修改内容：无
     ********************************************************************************/
    function _getUserTestInfoByAlltestID() {
        var appID = G_Cookie.getAppID();
        var guid = G_Cookie.getGuid();	//检验码
        var AlltestIdArr = JSON.stringify(_arrContrastChildTableID);
        //AlltestIdArr = _arrContrastChildTableID;//AlltestID_ChildtableId的数组
        //判断科目、用户
        if (!appID || !guid) {
            return;
        }
        var params = {
            appID: appID,
            testIDArr: AlltestIdArr,
            guid: guid
        };
        var userInfo = [];
        //从接口获取数据
        var success = function (json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) {
                userInfo = jsonObj.data.info;
            } else if (jsonObj.status === 300) {
                G_maiDian.setBugRecordInfos('程序错误', 'testData通过AlltestID——获取用户做题数据info包', jsonObj.status + ':' + jsonObj.msg);
            } else if (jsonObj.status >= 400 && jsonObj.status < 500) {
                G_maiDian.setBugRecordInfos('业务逻辑错误', 'testData通过AlltestID——获取用户做题数据info包', jsonObj.status + ':' + jsonObj.msg);
            } else {
                G_maiDian.setBugRecordInfos('其它程序错误', 'testData通过AlltestID——获取用户做题数据info包', jsonObj.status + ':' + jsonObj.msg);
            }
        };
        G_AjaxApiShequ.post('/api/exam/getReplyRecord', params, false, success);
        return JSON.stringify(userInfo);
    }
	/********************************************************************************
	函数名：_getAtest
	功能：获取Atest型题试题信息
	输入参数:curTest 当前试题数组
	返回值：单题试题对象
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	修改记录：黎萍（2014-07-04） 增加试题信息：score
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getAtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的ATestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.StyleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
		
		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
    	oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
    	oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		var explain = testItems[testItemIndex].Explain.trim(); //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint.trim(); //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //选项
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'yyyy-MM-dd');//时间
		return oneTestShow;
	}
	/********************************************************************************
	函数名：_getA3test
	功能：获取A3test型题试题信息
	输入参数:curTest 当前试题数组
	返回值：单题试题对象
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	修改记录：黎萍（2014-07-04） 增加试题信息：score
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getA3test(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的A3TestID
		var subTestItemIndex = curTest.subTestItemIndex; //小题ID,针对A3题型的A3TestItemIndex
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.StyleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
		var A3TestItems = testItems[testItemIndex].A3TestItems;
		
		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.subTestType = styleItems[styleItemIndex].SubType === undefined ? '单项' : styleItems[styleItemIndex].SubType; //选项类型，值有：空，单项，多项，不定项
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
    	oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
    	oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.frontTitle = testItems[testItemIndex].FrontTitle; //共用主标题
		oneTestShow.isFav = A3TestItems[subTestItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = A3TestItems[subTestItemIndex].UserNoteContent; //是否收藏
		oneTestShow.subTestID = A3TestItems[subTestItemIndex].A3TestItemID;
		oneTestShow.answer = A3TestItems[subTestItemIndex].Answer; //答案
		oneTestShow.title = A3TestItems[subTestItemIndex].Title; //小标题
		var explain = A3TestItems[subTestItemIndex].Explain.trim(); //解题思路
		if(!explain){
			explain = testItems[testItemIndex].Explain.trim();
		}
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = A3TestItems[subTestItemIndex].TestPoint.trim(); //考试重点
		if(!testPoint){
			testPoint = testItems[testItemIndex].TestPoint.trim();
		}
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.selectedItems = A3TestItems[subTestItemIndex].SelectedItems; //选项
		oneTestShow.time=G_Prg.datetimeFormat(new Date(A3TestItems[subTestItemIndex].NoteTime), 'yyyy-MM-dd');//时间

		return oneTestShow;
	}
	/********************************************************************************
	函数名：_getBtest
	功能：获取Btest型题试题信息
	输入参数:curTest 当前试题数组
	返回值：单题试题对象
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	修改记录：黎萍（2014-07-04） 增加试题信息：score
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getBtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的BTestID
		var subTestItemIndex = curTest.subTestItemIndex; //小题ID,针对B题型的BTestItemIndex
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.StyleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
		var BTestItems = testItems[testItemIndex].BTestItems;

		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.subTestType = styleItems[styleItemIndex].SubType === undefined ? '单项' : styleItems[styleItemIndex].SubType; //选项类型，值有：空，单项，多项，不定项
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型定项
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
    	oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
    	oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //共用选项
		oneTestShow.isFav = BTestItems[subTestItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = BTestItems[subTestItemIndex].UserNoteContent; //用户笔记
		oneTestShow.subTestID = BTestItems[subTestItemIndex].BTestItemID;
		oneTestShow.answer = BTestItems[subTestItemIndex].Answer; //答案
		oneTestShow.title = BTestItems[subTestItemIndex].Title; //小标题
		var explain = BTestItems[subTestItemIndex].Explain.trim(); //解题思路
		if(!explain){
			explain = testItems[testItemIndex].Explain.trim();
		}
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = BTestItems[subTestItemIndex].TestPoint.trim(); //考试重点
		if(!testPoint){
			testPoint = testItems[testItemIndex].TestPoint.trim();
		}
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.time=G_Prg.datetimeFormat(new Date(BTestItems[subTestItemIndex].NoteTime), 'yyyy-MM-dd');//时间

		return oneTestShow;
	}
	/********************************************************************************
	函数名：_getJDtest
	功能：获取JDtest型题试题信息
	输入参数:curTest 当前试题数组
	返回值：单题试题对象
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	修改记录：黎萍（2014-07-04） 增加试题信息：score
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getJDtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的JDTestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.StyleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
	
		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
    	oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
    	oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		var explain = testItems[testItemIndex].Explain.trim(); //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint.trim(); //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'yyyy-MM-dd');//时间

		return oneTestShow;
	}
	/********************************************************************************
	函数名：_getPDtest
	功能：获取PDtest型题试题信息
	输入参数:curTest 当前试题数组
	返回值：单题试题对象
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	修改记录：黎萍（2014-07-04） 增加试题信息：score
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getPDtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的PDTestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.StyleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
	
		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
    	oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
    	oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		var explain = testItems[testItemIndex].Explain.trim(); //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint.trim(); //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'yyyy-MM-dd');//时间
		selectedItems = [{Content: "对",ItemName: "A"},{Content: "错",ItemName: "B"}];
		oneTestShow.selectedItems = selectedItems; //选项

		return oneTestShow;
	}
	/********************************************************************************
	函数名：_getTKtest
	功能：获取TKtest型题试题信息
	输入参数:curTest 当前试题数组
	返回值：单题试题对象
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	修改记录：黎萍（2014-07-04） 增加试题信息：score
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getTKtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的TKTestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.StyleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
		
		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
    	oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
    	oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		var explain = testItems[testItemIndex].Explain.trim(); //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint.trim(); //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		var answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.answer = G_SetTestInfo.splitTKTestAnswer(answer); //先进行选项分隔
		oneTestShow.answerType = testItems[testItemIndex].AnswerType;	//答案比较顺序
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'yyyy-MM-dd');//时间

		return oneTestShow;
	}
	/********************************************************************************
	函数名：_getXtest
	功能：获取Xtest型题试题信息
	输入参数:curTest 当前试题数组
	返回值：单题试题对象
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-06-24） 增加试题信息：AllTestID,StyleID
	修改记录：黎萍（2014-07-03） 增加试题信息：cptID,sbjID,srcID,subTestID
	修改记录：黎萍（2014-07-04） 增加试题信息：score
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	修改记录：黎萍（2014-07-09）修改将试题信息赋值到结构体的方式
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	function _getXtest(curTest) {
		var oneTestShow =  new OneTestShow();
		var styleItemIndex = curTest.styleItemIndex; //题型ID,json数据中的StyleID
		var testItemIndex = curTest.testItemIndex; //大标题ID,json数据中题型的XTestID
		oneTestShow.testNO = curTest.testNO;
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
		var styleItems = _jsonAllTest.StyleItems;
		var testItems = styleItems[styleItemIndex].TestItems;
		
		oneTestShow.score = styleItems[styleItemIndex].Score;	//分数
		oneTestShow.testType = styleItems[styleItemIndex].Type; //题型
		oneTestShow.testStyle = styleItems[styleItemIndex].Style; //题型
		oneTestShow.styleID = styleItems[styleItemIndex].StyleID;
		oneTestShow.styleExplain = styleItems[styleItemIndex].Explain; //题型说明
		oneTestShow.cptID = testItems[testItemIndex].CptID; //章节ID
    	oneTestShow.sbjID = testItems[testItemIndex].SbjID; //科目ID
    	oneTestShow.srcID = testItems[testItemIndex].SrcID;	//来源ID
		oneTestShow.allTestID = testItems[testItemIndex].AllTestID;
		oneTestShow.title = testItems[testItemIndex].Title; //标题
		oneTestShow.isFav = testItems[testItemIndex].IsFav; //是否收藏
		oneTestShow.userNote = testItems[testItemIndex].UserNoteContent; //用户笔记
		var explain = testItems[testItemIndex].Explain.trim(); //解题思路
		oneTestShow.explain = explain === '' ? '无' : explain; //没有解析，设置默认值
		var testPoint = testItems[testItemIndex].TestPoint.trim(); //考试重点
		oneTestShow.testPoint = testPoint === '' ? '无' : testPoint; //没有解析，设置默认值
		oneTestShow.answer = testItems[testItemIndex].Answer; //答案
		oneTestShow.selectedItems = testItems[testItemIndex].SelectedItems; //选项
		oneTestShow.time=G_Prg.datetimeFormat(new Date(testItems[testItemIndex].NoteTime), 'yyyy-MM-dd');//时间

		return oneTestShow;
	}

   

	/********************************************************************************
	以下为公共变量、公共函数
	 *******************************************************************************/
	
	/********************************************************************************
	函数名：getIsVip
	功能：获取标记是否是VIP用户的
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-07-09）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getExamHistoryID = function () {
		return _examHistoryID;
	};
	/********************************************************************************
	函数名：getIsVip
	功能：获取标记是否是VIP用户的
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-07-09）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getIsVip = function () {
		return _isVip;
	};
	/********************************************************************************
	函数名：getConfigJson
	功能：获取模拟考场配置json
	输入参数:无
	返回值：_configJson 模拟考场配置json
	创建信息：黎萍（2014-10-22）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getConfigJson = function () {
		return _configJson;
	};
	/********************************************************************************
	函数名：getArrAllTest
	功能：获取试题结构体数组
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-07-09）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getArrAllTest = function () {
		return _arrAllTest;
	};
	/********************************************************************************
	函数名：getJsonAllTest
	功能：获取试题
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-08-26）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getJsonAllTest = function () {
		return _jsonAllTest;
	};
	this.getArrUserTest = function(){
		return _arrUserTest;
	};
	this.getMaxTestTime = function(){
		return _maxTestTime;
	};
	/********************************************************************************
	函数名：getCurIndex
	功能：获取当前试题的索引
	输入参数:无
	返回值：_index 当前试题的索引
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getCurIndex = function () {
		return _index; //试题的当前索引，从0开始
	};
	/********************************************************************************
	函数名：getTestCount
	功能：获取试题数量
	输入参数:无
	返回值： 试题数量
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getTestCount = function () {
        if(!_arrAllTest.length){
            G_Prg.throw('试题数组为空，请联系客服QQ:4007278800！');
        }
		return _arrAllTest.length; //试题数量
	};
	/********************************************************************************
	函数名：movePre
	功能：移动到上一题
	输入参数:无
	返回值：成功返回true，如果已经是第一题则返回false，操作页面对返回值进行判断，进行提示“已经是第一题”
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	          陶云（2016-05-04） 存储浏览的时间
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.movePre = function () {
		if(typeof(G_maiDian)!=='undefined'){
		//  G_maiDian.fc_answerClickCount('手势上一题');
		}
		if (_index <= 0) {
			return false;
		} else {
			_index--;
			_setUserInfoCache(this.getCurTest(),_arrAllTest[_index]);
			return true;
		}
	};
	/********************************************************************************
	函数名：moveNext
	功能：移动到下一题
	输入参数:无
	返回值：成功返回true，如果已经是第一题则返回false，操作页面对返回值进行判断，进行提示"已经是最后一题"
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	          陶云（2016-05-04） 存储浏览的时间
	          陶云（2016-05-10） 添加埋点
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.moveNext = function () {
		if(typeof(G_maiDian)!=='undefined'){
		//  G_maiDian.fc_answerClickCount('手势下一题');
		}
		if (_index >= (_arrAllTest.length - 1)) {
			return false;
		} else {
			_index++;
			_setUserInfoCache(this.getCurTest(),_arrAllTest[_index]);
			return true;
		}
	};
	/********************************************************************************
	函数名：move
	功能：移动到指定的答题卡上题号
	输入参数:index 试题数组索引
	返回值：成功返回true，如果已经是第一题则返回false
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.move = function (index) {
		if ((index < 0) || (index >= _arrAllTest.length)) {
			return false;
		} else {
			_index = index;
			return true;
		}
	};
	/********************************************************************************
	函数名：setUserReply
	功能：设置用户的答案
	输入参数:	userReply 用户输入的答案
	返回值：无
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.setUserReply = function (userReply) {
		_arrAllTest[_index].userReply = userReply;
	};
	/********************************************************************************
	函数名：getUserReply
	功能：获取用户的答案
	输入参数:	index 试题数组索引
	返回值：用户的答案
	创建信息：黎萍（2014-06-10）
	修改记录：无
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getUserReply = function (index) {
		return _arrAllTest[index].userReply;
	};
	/********************************************************************************
	函数名：setIsRight
	功能：设置用户答题是否正确
	输入参数:	isRight 标记用户回答是否正确
	返回值：无
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加函数注释
				黎萍（2016-05-20）游客不进行信息本地缓存操作
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.setIsRight = function (isRight) {
		var rightNum = 0;
		var testNum = 0;
		var oldIsRight = _arrAllTest[_index].isRight;
		if(oldIsRight === false){
			testNum = 1;	//之前未答过，做题数量记为1
			if(isRight === 0){	//现在答对
				rightNum = 1;
			}
		}
		if(oldIsRight === 1){	//之前答错
			if(isRight === 0){	//现在答对
				rightNum = 1;
			}
		}else if(oldIsRight === 0){	//之前答对
			if(isRight === 1){	//现在答错
				rightNum = -1;
			}
		}
		_arrAllTest[_index].isRight = isRight;
		if(!G_Cookie.getUserID()){	//游客不进行信息本地缓存操作
			return;
		}
		var type = G_Prg.getQueryString('type');
		//错题重做，试题已答数量不进行计数
		if(type === 'myError' || type === 'userError'){
			testNum = 0;
		}
		/*else{
			testNum = _setDoneTestNum(this.getCurTest());
		}*/
		//笔记、收藏等试题已答数量进行计数需要进行判断
		/*if(_fromUrl !== 'chapterExam'){
			testNum = _setDoneTestNum(this.getCurTest());
		}*/
		
		/*if(_arrAllTest[_index].state === 'commited'){
			_setUserInfoCache(this.getCurTest(),_arrAllTest[_index]);
		}*/
		if(typeof(G_ChapterCache)!=='undefined'){
			G_ChapterCache.setCptIDInfo(this.getCurTest().cptID,{'testCount':testNum,'rightCount':rightNum});
		}
	};
	/********************************************************************************
	 功能：设置非章节练习时，计算对应章节的已答试题数量
	 输入参数: cptID 章节id
	 返回值：doneNum 对应章节的已答试题数量
	 最后修改人：黎萍（2016-5-12）
	 修改内容：无
	 ********************************************************************************/
	function _setDoneTestNum(curTest){
		var doneNum = 1;
		//非章节练习，需要根据章节id获取本地缓存的用户答题info数据包
		_arrUserTest = JSON.parse(G_UserInfoCache.getUserInfoCache(curTest.cptID));
		if(_arrUserTest.length > 0){
			var dataLen = _arrUserTest.length;
			for(var i = 0; i < dataLen; i++){
				//该试题之前已经存在答题记录
				if(_arrUserTest[i].State==='commited' && _arrUserTest[i].AllTestID===curTest.allTestID){
					doneNum = 0;
					break;
				}
			}
		}
		return doneNum;
	}
	/********************************************************************************
	 功能：将用户详细答题记录（回答对错情况、笔记、收藏）添加到info包中，然后换成到本地localStorage
	 输入参数: curTest 当前试题,curTestArrObj 在结构体数组中当前试题对象
	 返回值：无
	 最后修改人：黎萍（2016-4-12）
	 修改内容：无
	 ********************************************************************************/
	function _setUserInfoCache(curTest,curTestArrObj){
		var lastReplyTime = G_Prg.datetimeFormat(new Date(), 'yyyy-MM-dd hh:mm:ss');
		if(_arrUserTest.length > 0){
			var dataLen = _arrUserTest.length;
			for(var i = 0; i < dataLen; i++){
				if(_IsExistTest(curTest.allTestID) >= 0){	//如当前试题存在info数据包中，则进行修改info包数据
					if(_arrUserTest[i].AllTestID === curTest.allTestID){
						_arrUserTest[i].IsRight = curTestArrObj.isRight;
						_arrUserTest[i].UserAnswer = curTestArrObj.userReply;
						_arrUserTest[i].State = curTestArrObj.state;
						_arrUserTest[i].IsFav = curTestArrObj.fav;
						_arrUserTest[i].UserNote = curTestArrObj.userNote;
						_arrUserTest[i].NoteTime = curTestArrObj.time;
						_arrUserTest[i].LastReplyTime = lastReplyTime;
					}else{
						continue;
					}
				}else{	//info包添加新的数据
					_arrUserTest.push({
						AllTestID: curTest.allTestID,
						ChildTableID: curTest.subTestID,
						IsFav: curTestArrObj.fav,
						IsRight: curTestArrObj.isRight,
						LastReplyTime: lastReplyTime,
						NoteTime: curTestArrObj.time,
						State: curTestArrObj.state,
						UserAnswer: curTestArrObj.userReply,
						UserNote: curTestArrObj.userNote
					});
				}
				if(typeof(G_UserInfoCache)!=='undefined'){
					G_UserInfoCache.setUserInfoCache(curTest.cptID,_arrUserTest);
				}
				break;
			}
		}else{
			_arrUserTest.push({
				AllTestID: curTest.allTestID,
				ChildTableID: curTest.subTestID,
				IsFav: curTestArrObj.fav,
				IsRight: curTestArrObj.isRight,
				LastReplyTime: lastReplyTime,
				NoteTime: curTestArrObj.time,
				State: curTestArrObj.state,
				UserAnswer: curTestArrObj.userReply,
				UserNote: curTestArrObj.userNote
			});
			if(typeof(G_UserInfoCache)!=='undefined'){
				G_UserInfoCache.setUserInfoCache(curTest.cptID,_arrUserTest);
			}
		}
		//检查当前试题是否存在用户数据info包中
		function _IsExistTest(param){
			var dataLen = _arrUserTest.length;
			for(var i = 0; i < dataLen; i++){
				if(_arrUserTest[i].AllTestID === param){
					return i;
				}
			}
			return -1;
		}
	}
	/********************************************************************************
	函数名：getIsRight
	功能：获取用户答题是否正确
	输入参数:	index 试题数组索引
	返回值：用户的答案
	创建信息：黎萍（2014-06-10）
	修改记录：无
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getIsRight = function (index) {
		return _arrAllTest[index].isRight;
	};
	/********************************************************************************
	函数名：setSelected
	功能：设置标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
	输入参数:	selected 标记值
	返回值：无
	创建信息：黎萍（2014-08-06）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.setSelected = function (selected) {
		_arrAllTest[_index].selected = selected;
	};
	/********************************************************************************
	函数名：getSelected
	功能：获取标记章节练习的多选题已被选中，但是没有进行答案的提交；1 已选中 0 已提交
	输入参数:	index 试题数组索引
	返回值：标记值
	创建信息：黎萍（2014-08-06）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getSelected = function (index) {
		return _arrAllTest[index].selected;
	};
	/********************************************************************************
	函数名：setState
	功能：设置用户操作试题的状态
	输入参数:	state 标记值，flag 标记要批量进行状态赋值
	返回值：无
	创建信息：黎萍（2014-09-01）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.setState = function (state,flag) {
		if(!flag){
			_arrAllTest[_index].lastState = _arrAllTest[_index].state ;
			_arrAllTest[_index].state = state;
		}else{
			for(var i = 0; i < _arrAllTest.length; i++){
				_arrAllTest[i].lastState = _arrAllTest[i].state ;
				_arrAllTest[i].state = state;
			}
		}
	};
	/********************************************************************************
	函数名：getState
	功能：获取标记当前试题是否提交了答案
	输入参数:	index 试题数组索引
	返回值：标记值
	创建信息：黎萍（2014-09-01）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getState = function (index) {
		if(_arrAllTest[index].testNO !== index+1){
			return;
		}
		return _arrAllTest[index].state;
	};
	/********************************************************************************
	函数名：setAction
	功能：设置用户操作试题的动作
	输入参数:	actionName 操作试题的动作,flag 标记是否将所有试题都标记为此动作
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.setAction = function(actionName,flag){
		if(!flag){
			_arrAllTest[_index].lastAction = _arrAllTest[_index].action;			
			_arrAllTest[_index].action = actionName;
		}else{
			for(var i = 0; i < _arrAllTest.length; i++){
				_arrAllTest[i].lastAction = _arrAllTest[i].action;	
				_arrAllTest[i].action = actionName;
			}
		}
    };
	/********************************************************************************
	函数名：recoverState
	功能：恢复用户之前操作试题的状态
	输入参数:	无
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.recoverState = function(){
		for(var i = 0; i < _arrAllTest.length; i++){
			_arrAllTest[i].state = _arrAllTest[i].lastState ;
		}
	};
	/********************************************************************************
	函数名：getLastState
	功能：获取用户上一个操作状态
	输入参数:	index 当前试题索引
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getLastState = function(index){
		return _arrAllTest[index].lastState;
	};
    /********************************************************************************
	函数名：getLastState
	功能：获取用户上一个操作状态
	输入参数:	index 当前试题索引
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getLastAction = function(index){
		if(_arrAllTest[index].testNO !== index+1){
			return;
		}
		return _arrAllTest[index].lastAction;
	};
	/********************************************************************************
	函数名：recoverAction
	功能：恢复用户之前的操作动作
	输入参数:	无
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.recoverAction = function(){
		for(var i = 0; i < _arrAllTest.length; i++){
			_arrAllTest[i].action = _arrAllTest[i].lastAction ;
		}
	};
    /********************************************************************************
	函数名：clearAction
	功能：清空用户之前的操作动作
	输入参数:	无
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.clearAction = function(){
		for(var i = 0; i < _arrAllTest.length; i++){
			_arrAllTest[i].action = '';
            _arrAllTest[i].lastAction = '';
		}
	};
	/********************************************************************************
	函数名：getAction
	功能：获取用户当前试题的操作动作
	输入参数:	index 当前试题索引
	返回值：无
	创建信息：黎萍（2014-09-04）
	修改记录：无
	审查人：无
	 *******************************************************************************/
    this.getAction = function(index){
		if(_arrAllTest[index].testNO !== index+1){
			return;
		}
        return _arrAllTest[index].action;
    };
	/********************************************************************************
	函数名：setFav
	功能：设置用户是否收藏试题
	输入参数:	fav 收藏状态
	返回值：无
	创建信息：黎萍（2014-07-04）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.setFav = function (fav) {
		_arrAllTest[_index].fav = fav;
		_setUserInfoCache(this.getCurTest(),_arrAllTest[_index]);
	};
	/********************************************************************************
	函数名：getFav
	功能：获取用户是否收藏试题
	输入参数:	index 试题数组索引
	返回值：试题收藏状态
	创建信息：黎萍（2014-07-04）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getFav = function (index) {
		return _arrAllTest[index].fav;
	};
	/********************************************************************************
	函数名：setUserNote
	功能：设置用户是否对试题做了笔记
	输入参数:	userNote 用户笔记
	返回值：无
	创建信息：黎萍（2014-07-04）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.setUserNote = function (userNote) {
		_arrAllTest[_index].userNote = userNote;
		_setUserInfoCache(this.getCurTest(),_arrAllTest[_index]);
	};
	/********************************************************************************
	函数名：getUserNote
	功能：获取用户是否对试题做了笔记
	输入参数:	index 试题数组索引
	返回值：用户笔记
	创建信息：黎萍（2014-07-04）
	修改记录：无
	审查人：无
	*******************************************************************************/
	this.getUserNote = function (index) {
		return _arrAllTest[index].userNote;
	};
	
	this.setUserSeekHelp = function(userSeekHelp){
		_arrAllTest[_index].userSeekHelp = userSeekHelp;
	};
	this.getUserSeekHelp = function(index){
		return _arrAllTest[index].userSeekHelp;
	};
	this.setUserExplain = function(userExplain){
		_arrAllTest[_index].userExplain = userExplain;
	};
	this.getUserExplain = function(index){
		return _arrAllTest[index].userExplain;
	};
	this.setUserDiscuss = function(userDiscuss){
		_arrAllTest[_index].userDiscuss = userDiscuss;
	};
	this.getUserDiscuss = function(index){
		return _arrAllTest[index].userDiscuss;
	};
	this.setUserFeedback = function(userFeedback){
		_arrAllTest[_index].userFeedback = userFeedback;
	};
	this.getUserFeedback = function(index){
		return _arrAllTest[index].userFeedback;
	};
	this.setDiscussCount = function(count){
		_arrAllTest[_index].discussCount = count;
	};
	this.getDiscussCount = function(index){
		return _arrAllTest[index].discussCount;
	};
	this.setUserCrrect = function(userCrrect){
		_arrAllTest[_index].userCrrect = userCrrect;
	};
	this.getUserCrrect = function(index){
		return _arrAllTest[index].userCrrect;
	};
	this.setStatisticsData = function(statisticsData){
		_arrAllTest[_index].statisticsData = statisticsData;
	};
	this.getStatisticsData = function(index){
		return _arrAllTest[index].statisticsData;
	};
	this.setKnowledgePoint = function (knowledgePoint) {
        _arrAllTest[_index].knowledgePoint = knowledgePoint;
    };
    this.getKnowledgePoint = function (index) {
        return _arrAllTest[index].knowledgePoint;
    };
	this.setUnableNumber = function (unableNumber) {
        _arrAllTest[_index].unableNumber = unableNumber;
    };
    this.getUnableNumber = function (index) {
        return _arrAllTest[index].unableNumber;
    };
	this.setDoExamNumber = function (doExamNumber) {
        _arrAllTest[_index].doExamNumber = doExamNumber;
    };
    this.getDoExamNumber = function (index) {
        return _arrAllTest[index].doExamNumber;
    };

    /********************************************************************************
	函数名：setTime
	功能：设置笔记时间
	输入参数:time  笔记时间
	返回值：无
	创建信息：韦友爱（2014-07-14）
	修改记录：无
	审查人：无
	*******************************************************************************/
    this.setTime = function (time) {
		_arrAllTest[_index].time = time;
	};
    /********************************************************************************
	函数名：getTime
	功能：设置笔记时间
	输入参数:index  试题数组索引
	返回值：添加试题笔记时间
	创建信息：韦友爱（2014-07-14）
	修改记录：陶云（2016-05-18）取消时间的再次格式化。
	审查人：无
	*******************************************************************************/
    this.getTime = function (index) {
		//return _arrAllTest[index].time;
		return G_Prg.datetimeFormat(new Date(_arrAllTest[index].time), 'yyyy-MM-dd');
	};
	/********************************************************************************
	函数名：calculateScores
	功能：计算分数
	输入参数：无
	返回值：返回考试结果，考试结果有：未做试题数，试题总数、已做试题数、答对试题数、正确率、成绩评定
	创建信息：黎萍（2014-05-23）
	修改记录：兰涛（2014-05-27）修改函数名称
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.calculateScores = function () {
		var testCount = _arrAllTest.length; //试题总数
		var doneNum = 0; //已做试题数
		var rightNum = 0; //答对试题数
		var notDoNum = 0; //未做试题数
		var correctRate = 0; //正确率
		//计算用户的总得分和试题满分
		var allScore = 0;
		var userScore = 0;
		for (var i = 0; i < testCount; i++) {
			if (_arrAllTest[i].userReply !== '' && _arrAllTest[i].isRight !== false) {
				doneNum++; //获取已做总数
			}
			if (_arrAllTest[i].isRight === 0) { //答对
				rightNum++; //获取答对总数
			}
			allScore += Number(_arrAllTest[i].score);
			if (_arrAllTest[i].isRight === 0) { 
				userScore += Number(_arrAllTest[i].score);	//用户的得分
			}
		}
		notDoNum = testCount - doneNum; //计算未做总数
		if (doneNum > 0) {
			correctRate = (Number(rightNum / doneNum)*100).toFixed(2);
		}		
			
		var scoreJSON = {doneNum:doneNum,rightNum:rightNum,correctRate:correctRate,testCount:testCount,notDoNum:notDoNum,allScore:allScore,userScore:userScore};
		return scoreJSON;
	};
	/********************************************************************************
	函数名：getTest
	功能：获取指定索引试题
	输入参数:	index 试题编号索引
	返回值：curTestShow 返回包含试题所有信息的结构体
	创建信息：黎萍（2014-05-28）
	修改记录：黎萍（2014-07-09）将获取每种题型的参数index修改成传参数curTest
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getTest = function (index) {
		var curTest = _arrAllTest[index];
		if(_jsonAllTest === '' || _jsonAllTest === undefined){
			return;
		}
        //如果超过了题目的索引返回null
        if(!curTest){
            return null;
        }
		var testType = _jsonAllTest.StyleItems[curTest.styleItemIndex].Type; //根据试题编号获取试题所属题型
		var curTestShow = {};

		switch (testType) {
		case 'ATEST':
			curTestShow = _getAtest(curTest);
			break;
		case 'A3TEST':
			curTestShow = _getA3test(curTest);
			break;
		case 'BTEST':
			curTestShow = _getBtest(curTest);
			break;
		case 'JDTEST':
			curTestShow = _getJDtest(curTest);
			break;
		case 'PDTEST':
			curTestShow = _getPDtest(curTest);
			break;
		case 'TKTEST':
			curTestShow = _getTKtest(curTest);
			break;
		case 'XTEST':
			curTestShow = _getXtest(curTest);
			break;
		default:
			G_Prg.throw('程序运行错误，TestData.getTest：testType = "' + testType + '",无法解析数据');
		}
		return curTestShow;
	};
	/********************************************************************************
	函数名：getCurTest
	功能：获取当前试题
	输入参数:无
	返回值：curTestShow当前试题
	创建信息：兰涛（2014-05-28）
	修改记录：黎萍（2014-05-28） 增加注释，根据题型解析试题
	修改记录：黎萍（2014-06-26） 修改注释
	审查人：兰涛（2014-06-26）
	 *******************************************************************************/
	this.getCurTest = function () {
		return this.getTest(_index);
	};
	/********************************************************************************
     函数名：setTitle
     功能：设置做题界面的导航标题
     输入参数:
     返回值：无
     创建信息：黎萍（2014-08-26）
     修改记录：无
     审查人：无
     *******************************************************************************/
	this.setTitle = function (title){
		_title = title;
	}
	this.getKJCYData = function (){
		return _data_KJCY;
	}
	/********************************************************************************
	函数名：getShareUrl
	功能：获取共享试题的地址
	输入参数:无
	返回值：无
	创建信息：黎萍（2014-09-23）
	修改记录：无
	审查人：无
	 *******************************************************************************/
	this.getShareUrl = function () {
		return _shareUrl;
	};
    /********************************************************************************
     函数名：_setExplain
     功能：生成包含题型以及该题型结束题号的数组
     输入参数: 无
     返回值: type 包含题型以及该题型结束题号的数组
     创建信息：韦友爱（2014-08-06）
     修改记录：无
     审查人：无
     *******************************************************************************/
    this.setExplain=function() {
        var arrAllTest = _arrAllTest;
        var type = [];
        var index = 0;
        if(arrAllTest.length===1){
            type[0]={
                type : arrAllTest[0].type,
                startNO : 1,
                endNO : 1
            };
            return type;
        }
        for (var i = 0; i < arrAllTest.length - 1; i++) {
            var startNum=1;
            if(index>0){
                startNum = type[index-1].endNO + 1;
            }
            if (arrAllTest[i].style !== arrAllTest[i + 1].style) {
                var n = {
                    type : arrAllTest[i].type,
                    startNO : startNum,
                    endNO : i + 1
                };
                type[index] = n;
                index++;
                if (i === arrAllTest.length - 2) {//最后一题与前一题不同
                    var n = {
                        type : arrAllTest[i + 1].type,
                        startNO : type[index - 1].endNO+1,
                        endNO : arrAllTest.length
                    };
                    type[index] = n;
                    break;
                }
            }
            if (i === arrAllTest.length - 2) {//最后一题与前一题相同
                var n = {
                    type : arrAllTest[i + 1].type,
                    startNO : startNum,
                    endNO : arrAllTest.length
                };
                type[type.length] = n;
                break;
            }
        }
        return type;
    }
	/********************************************************************************
    函数名：getCurAllTestID
    功能：获取用户答题明细info包中最后答的试题AllTestID
    输入参数: 无
    返回值: 试题AllTestID
    创建信息：黎萍（2015-11-17）
    修改记录：无
    审查人：无
    *******************************************************************************/
	this.getCurAllTestID = function(){
		return _curAllTestID;
	};
    /********************************************************************************
    函数名：getTestNO
    功能：生成包含题型以及该题型结束题号的数组
    输入参数: allTestID 试题编号
    返回值: 题号
    创建信息：韦友爱（2014-09-10）
    修改记录：无
    审查人：无
    *******************************************************************************/
	this.getTestNO=function(allTestID){
         if(!allTestID){
             return 1;
         }
         var arrContrast=_arrContrast;
         for(var i=0;i<arrContrast.length;i++){
             if(arrContrast[i]===allTestID){
                  return(i+1);
             }
         }
         return 1;
    }
    /********************************************************************************
     函数名：getTestNOChildTableID
     功能：生成包含题型以及该题型结束题号的数组,如果没有childTableId,childTableId为-1 [{大题ID, 小题ID}],如[{"AllTestID": 1,"ChildTableID"：-1}]
     输入参数: allTestID 试题编号
     返回值: 题号
     创建信息：陶云（2016-10-09）
     修改记录：无
     审查人：无
     *******************************************************************************/
    this.getTestNOChildTableID = function (allTestID) {
        if (!allTestID) {
            return 1;
        }
        var arrContrastChildTableID = _arrContrastChildTableID;
        for (var i = 0; i < arrContrastChildTableID.length; i++) {
            if (arrContrastChildTableID[i] === allTestID) {
                return (i + 1);
            }
        }
        return 1;
    }
    this.getArrAllTestID_ChlidTableID = function () {
        return _arrContrastChildTableID;
    };
	/********************************************************************************
     函数名：getConfigIDArr
     功能：获取模拟考场配置索引id数组（针对会计从业）
     输入参数: 无
     返回值：false 不显示,true 显示
     创建信息：黎萍（2016-03-02）
     修改记录：无
     审查人：无
     *******************************************************************************/
	this.getConfigIDArr = function(){
		return _configIDArr;
	};
	/********************************************************************************
     函数名：isShowEnterBtn
     功能：判断是否显示“进入下一场考试”按钮
     输入参数: 无
     返回值：false 不显示,true 显示
     创建信息：黎萍（2016-03-01）
     修改记录：无
     审查人：无
     *******************************************************************************/
	this.isShowEnterBtn = function(){
		//if(_configIDArrIndex === _configIDArr.length-1 || _configIDArr.length === 0){ 只有一场考试，或走到最后一场考试，不显示按钮
		if(_configIDArr.length === 0){
			return false;
		}
		return true;
	};
	/********************************************************************************
     函数名：enterNextTest
     功能：（只针对会计从业）进入下一场考试：在获取下一场考试试题数据之前，
			先判断当前这一套试卷是否批阅了，如果批阅了则将数据和答题数据缓存到本地
     输入参数: 无
     返回值：无
     创建信息：黎萍（2016-03-01）
     修改记录：无
     审查人：无
     *******************************************************************************/
	this.enterNextTest = function(){
		if(!G_Storage.checkLocalStorageSupport()){
			G_Prg.alert('抱歉，您的浏览器不支持LocalStorage！如果进入下一场考试会丢失本场考试的做题记录！需要您更换浏览器才能解决此类问题。'); 
			return;
		}
		var testJson = {'title':_title,'jsonAllTest' : _jsonAllTest,'arrAllTest' :_arrAllTest};
		var userID = G_Cookie.getUserID();
		//如果最后一套试卷的试题数据存在本地缓存，则配置数组索引采取递减方式计算
		var keyName = userID+'_simulatedTestJson_'+(_configIDArr.length-1);
		if(!G_Storage.isExistLocalStorageKey(keyName)){
			G_Storage.setLocalStorageValue(userID+'_simulatedTestJson_'+_configIDArrIndex,testJson);
		}
		_configIDArrIndex++;
		G_Prg.setCookie('CONFIGID_INDEX',_configIDArrIndex);
		location.reload(true);
	}
    /********************************************************************************
     函数名 addCache
     功能：缓存试题
     输入参数
     返回值：无
     创建信息：廖黎（2014-09-22）
     修改记录：无
     审查人：无
     *******************************************************************************/
    function addCache(){
        var fromUrl = G_Prg.getQueryString('fromUrl'); //只有章节练习才需要缓存试题
        if(fromUrl !== 'chapterExam'){
            return;
        }
        if(G_Prg.getQueryString('type')){//错题、笔记、收藏、未做，不缓存
            return;
        }
        var data = {};
        data.jsonAllTest = _jsonAllTest;
        var userID = G_Cookie.getUserID() ? G_Cookie.getUserID() : -1;
        G_CptTestCache.addCache(userID, G_Cookie.getAppID(), G_Cookie.getCptID(), _isVip, data);
    }
	/********************************************************************************
     函数名_addReplyJson
     功能：缓存试题并保存现场 
     输入参数:
     返回值：无
     创建信息：黎萍（2014-08-26）
     修改记录：无
     审查人：无
     *******************************************************************************/
	 this.addReplyJson = function (){
		if(_fromUrl === 'comb'){	//知识点试题不进行答题操作数据记录
			return;
		}
        addCache();
		if(!G_Storage.checkLocalStorageSupport()){
			// G_Prg.alert('抱歉，您的浏览器不支持LocalStorage！');	
			return;
		}
		var userID = G_Cookie.getUserID();
		if (!userID) {
			return;
		}
		//var fromUrl = G_Prg.getQueryString('fromUrl'); 
		var turl = '';
		//if(fromUrl === 'default.html'){
		if(_fromUrl === 'mockExam'){
			turl = _fromUrl;	
		}
		var doneTest = this.calculateScores();
		//未做试题数量为0，说明试题已经做完了，不需要进行现场的恢复
		if(doneTest.notDoNum === 0){
			G_Storage.removeLocalStorageValue(userID+'_'+G_Cookie.getAppEName()+'_testJson');
			return;	
		}
		var testNO = this.getCurTest().testNO;
		var testJson = {'title' : _title,'curTestNO' : testNO,'isVip' : _isVip,'examHistoryID' : this.getExamHistoryID(),'url' : turl,'jsonAllTest' : _jsonAllTest,'arrAllTest' :_arrAllTest};
		G_Storage.setLocalStorageValue(userID+'_'+G_Cookie.getAppEName()+'_testJson',testJson);
	}
    /********************************************************************************
    函数名：setMyNote
    功能：连接到setUserNote接口，设置当前试题的笔记内容
    输入参数: appID 软件ID； userID 用户ID
             curTest 当前试题； note 笔记内容；cb 回调函数，用于处理页面
    返回值：无
    创建信息：韦友爱（2014-07-15）
    修改记录：韦友爱（2014-07-16）添加调用_setNoteTestInfos()
				黎萍（2016-01-27）添加判断，知识点列表进入做题页面，不进行答题操作数据记录
	          陶云（2016-05-18）将setTime由今天改为时间
    审查人：无
     *******************************************************************************/
    this.setMyNote = function(curTest, note,appID,userID,userName) {
		if(_fromUrl === 'comb'){	//知识点试题不进行答题操作数据记录
			return;
		}
		var guid = G_Cookie.getGuid();
		if(!guid){
            G_Prg.throw('程序运行错误，TestData.setDiscussionContext : guid = "'+guid+'",获取数据出现异常'); 
        }
    	var childTableID = curTest.subTestID;
    	var childTableName = curTest.testType;
    	var allTestID = curTest.allTestID; //题目ID
    	var styleID = curTest.styleID; //题型ID
    	var cptID = curTest.cptID;
    	var srcID = curTest.srcID;
    	var sbjID = curTest.sbjID;
        var _this = this;
        if(note&&note.length>500){
            note=note.substr(0,500);
        }
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
               if(note){
                   _this.setUserNote(note);
    			   _this.setTime(G_Prg.datetimeFormat(new Date(), 'yyyy-MM-dd'));
               }else{
                   _this.setUserNote(null);
               }	
    		} else if (jsonData.status === 201) {
    			G_Prg.throw('程序运行错误，testData.setMyNote：status=' + jsonData.status + '更新笔记失败');
    		} else {
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——添加笔记',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——添加笔记',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——添加笔记',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.setMyNote：status=' + jsonData.status);
    		}
    	}
    	var params = {
    		appID : appID,
    		userID : userID,
    		cptID : cptID,
    		allTestID : allTestID,
    		childTableID : childTableID,
    		childTableName : childTableName,
    		srcID : srcID,
    		sbjID : sbjID,
    		styleID : styleID,
    		noteContent : G_Prg.shieldingWords(note),
    		userName : userName,
    		guid : guid
    	};
    	G_AjaxApi_Record.asyncPost('/api/exam/addUserNote', params, true, _success);
    }
	/********************************************************************************
     函数名：addReplyLookTime
     功能：添加浏览试题所消耗的时间
     输入参数:curTest 当前试题,appID 软件id,userID 用户id,useTime 浏览试题使用时间
     返回值：无
     创建信息：黎萍（2016-02-26）
     修改记录：无
     审查人：无
     *******************************************************************************/
	 this.addReplyLookTime = function(curTest,appID,userID,useTime){
		return;
        var childTableID =  curTest.subTestID;	//子表ID
        var childTableName = curTest.testType;	//子表名称
        var allTestID = curTest.allTestID; //题目ID
        var styleID = curTest.styleID; //题型ID
        var cptID = curTest.cptID;	//章节ID
        var srcID = curTest.srcID;	//来源ID
        var sbjID = curTest.sbjID;	//科目ID
		var guid = G_Cookie.getGuid();
		var examHistoryID = this.getExamHistoryID();
		var params = {
            appID : appID,
            userID : userID,
            guid : guid,
            cptID : cptID,
            allTestID : allTestID,
            childTableID : childTableID,
            childTableName : childTableName,
            srcID : srcID,
            sbjID : sbjID,
            styleID : styleID,
			spendTime : Math.ceil(useTime)
        };
        G_AjaxApi.asyncPost('/api/statistics/spendTime',params,true,function (json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) {	//200 获取数据成功
                return;
            }else if (jsonObj.status === 300) {	//300 连接数据库失败
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——浏览耗时',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLookTime : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }else if (jsonObj.status === 400) {
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——浏览耗时',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLookTime : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——浏览耗时',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLookTime : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }
        });
    };
     /********************************************************************************
     函数名：addReplyLog
     功能：添加答题记录明细
     输入参数:userAnswer 用户的答案；isRight标记用户是否回答正确
             endTime:答题结束时间； starTime：答题开始时间
     返回值：无
     创建信息：黎萍（2014-07-04）
     修改记录：廖黎
				黎萍（2016-01-27）添加判断，知识点列表进入做题页面，不进行答题操作数据记录
     审查人：无
     *******************************************************************************/
    this.addReplyLog = function(curTest,appID,userID,userName,guid,userAnswer,isRight,endTime, starTime,examType){
		if(_fromUrl === 'comb'){	//知识点试题不进行答题操作数据记录
			return;
		}
        var useTime = (endTime.getTime() - starTime.getTime())/1000;	
        var childTableID =  curTest.subTestID;	//子表ID
        var childTableName = curTest.testType;	//子表名称
        var allTestID = curTest.allTestID; //题目ID
        var styleID = curTest.styleID; //题型ID
        var cptID = curTest.cptID;	//章节ID
        var srcID = curTest.srcID;	//来源ID
        var sbjID = curTest.sbjID;	//科目ID
        var score = curTest.score;	//分数
        var lastUserReply = userAnswer;	//用户的答案
        var lastUserScore = 0;	//用户的得分
        if(isRight === 0){
            lastUserScore = score;
        }
		var examHistoryID = this.getExamHistoryID();
		var params = {
			examHistoryID : examHistoryID,
            appID : appID,
            userID : userID,
            cptID : cptID,
            allTestID : allTestID,
            childTableID : childTableID,
            childTableName : childTableName,
            srcID : srcID,
            sbjID : sbjID,
            styleID : styleID,
            lastUserReply : lastUserReply,
            score : score,
            lastUserScore : lastUserScore,
            userName : userName,
            guid : guid,
			spendTime : Math.ceil(useTime),
			examType : examType
        };
        G_AjaxApi_Record.asyncPost('/api/exam/updateUserReply',params,true,function (json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) {	//200 获取数据成功
                return;
            }else if (jsonObj.status === 300) {	//300 连接数据库失败
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——添加答题记录',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLog : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }else if (jsonObj.status === 400) {
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——添加答题记录',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLog : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——添加答题记录',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.addReplyLog : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }
        });
    }
     /********************************************************************************
     函数名：addFav
     功能：添加收藏
     输入参数:cb:执行成功后处理页面的回调函数
     返回值：无
     创建信息：韦友爱（2014-07-02）
     修改记录：黎萍（2014-07-04）修改提示信息
				黎萍（2016-01-27）添加判断，知识点列表进入做题页面，不进行答题操作数据记录
     审查人：无
     *******************************************************************************/
    this.addFav = function(curTest,appID,userID,userName,guid) {
		if(_fromUrl === 'comb'){	//知识点试题不进行答题操作数据记录
			return;
		}
        var _this = this;
        var dbSuccess = function(json){
            var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                _this.setFav(1);	//收藏成功，将收藏状态修改到结构体数组中，供给上一题、下一题使用
            }else if (jsonData.status === 201) {
                G_Prg.throw('程序运行错误，不能处理，testData.addFav：status=' + jsonData.status + '添加收藏失败');
            }else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——添加收藏',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——添加收藏',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——添加收藏',jsonData.status+':'+jsonData.msg);
				}
                G_Prg.throw('程序运行错误，不能处理，testData.addFav：status=' + jsonData.status);
            }
        }
		var childTableID=curTest.subTestID;
		var childTableName=curTest.testType;
		var allTestID = curTest.allTestID; //题目ID
		var styleID = curTest.styleID; //题型ID
		var cptID=curTest.cptID;
		var srcID=curTest.srcID;
		var sbjID=curTest.sbjID;
		var params= {appID:appID,userID:userID,cptID:cptID,allTestID:allTestID,childTableID:childTableID,childTableName:childTableName,srcID:srcID,sbjID:sbjID,styleID:styleID,userName:userName,guid:guid};
	 G_AjaxApi_Record.asyncPost('/api/exam/addUserFav', params,true, dbSuccess);
        
    }
     /********************************************************************************
     函数名：removeFav
     功能：取消收藏
     输入参数: cb:执行成功后处理页面的回调函数
     返回值：无
     创建信息：韦友爱（2014-07-02）
     修改记录：黎萍（2014-07-04）修改提示信息
     审查人：无
     *******************************************************************************/
    this.removeFav = function(curTest,appID,userID,userName,guid){
		var cptID=curTest.cptID;
		var allTestID = curTest.allTestID; //题目ID
		var childTableID=curTest.subTestID;
		var _this = this;
		var _success = function (json) {
			var jsonData = JSON.parse(json);
			if (jsonData.status === 200) {
				_this.setFav(0);	//取消收藏，将收藏状态修改到结构体数组中，供给上一题、下一题使用
			}else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——取消收藏',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——取消收藏',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——取消收藏',jsonData.status+':'+jsonData.msg);
				}
				G_Prg.throw('程序运行错误，不能处理，testData.removeFav：status=' + jsonData.status);
			}
		}
		var params={appID:appID,userID:userID,cptID:cptID,allTestID:allTestID,childTableID:childTableID,userName:userName,guid:guid};
		G_AjaxApi_Record.asyncPost('/api/exam/deleteUserFav', params,true, _success);
       
    }
    /********************************************************************************
     函数名：updateChapterHistory
     功能：将批阅的成绩保存到数据库中
     输入参数：totalNum 试题总数,testNum 已答过的试题总数,rightTestNum 答对的试题总数
              startTime 答题开始时间， 
     返回值：无
     创建信息：黎萍（2014-07-16）
     修改记录：廖黎（2014-07-29）加入回调函数，用于数据处理完成后反馈至页面
			   黎萍（2016-01-27）添加判断，知识点列表进入做题页面，不进行答题操作数据记录
     审查人：无
     *******************************************************************************/
    this.updateChapterHistory = function(curTest,appID,userID,cptName,totalNum,testNum,rightTestNum, startTime,examType,viewCount,allScore,userScore){
		if(_fromUrl === 'comb'){	//知识点试题不进行答题操作数据记录
			return;
		}
		var replyEndTime = new Date();
		var useTime = (replyEndTime.getTime() - startTime.getTime())/1000;
		var cptID = curTest.cptID;	//章节ID   
		var srcID = curTest.srcID;	//来源ID
		var sbjID = curTest.sbjID;	//科目ID
		var examHistoryID = this.getExamHistoryID();
		var params = {
			examHistoryID : examHistoryID,
			appID : appID,
			userID : userID,
			cptID : cptID,
			caption : cptName,
			replyStartTime : G_Prg.datetimeFormat(startTime,'yyyy-MM-dd hh:mm:ss'),
			replySpendTime : Math.ceil(useTime),
			rightTestNum : rightTestNum,
			totalNum : totalNum,
			testNum : testNum,
			score : allScore,
			userScore : userScore,
			srcID : srcID,
			sbjID : sbjID,
			viewCount : viewCount,
			examType : examType
		 };
		   G_AjaxApi_Record.post('/api/chapterHistory/updateChapterHistory',params,false,function (json) {
			  var jsonObj = JSON.parse(json);
			  if (jsonObj.status === 200) {	//200 获取数据成功
				  return;
			  }else if (jsonObj.status === 300) {	//300 连接数据库失败
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——批阅',jsonObj.status+':'+jsonObj.msg);
				  G_Prg.throw('程序运行错误，不能处理 TestData.updateChapterHistory : status = "'+jsonObj.status+'"！', function () {
					  location.reload(true);
				  });
			  }else if (jsonObj.status === 400) {
				  //  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——批阅',jsonObj.status+':'+jsonObj.msg);
				  G_Prg.throw('程序运行错误，不能处理 TestData.updateChapterHistory : status = "'+jsonObj.status+'"！',  function () {
					  location.reload(true);
				  });
			  }else{
				  //  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——批阅',jsonObj.status+':'+jsonObj.msg);
				  G_Prg.throw('程序运行错误，不能处理 TestData.updateChapterHistory : status = "'+jsonObj.status+'"！', function () {
					  location.reload(true);
				  });
			  }
			}
		  );
	}
	/********************************************************************************
    函数名：setShareTest
    功能：设置分享试题
    输入参数: 
    返回值: 无
    创建信息：黎萍（2014-09-23）
    修改记录：无
    审查人：无
    *******************************************************************************/
	this.setShareTest = function(testTitle,testJson){
		var params = {
			testTitle : testTitle,
			testJson : testJson
        };
        G_AjaxTestShare.post('/api/shareTest/getSharedHtmlUrl',params,false,function (json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) {	//200 获取数据成功
				_shareUrl = jsonObj.data.url;
                return;
            }else if (jsonObj.status === 300) {	//300 连接数据库失败
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——分享试题',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，TestData. setShareTest:  status = "'+jsonObj.status+'"，连接数据库失败！', function () {
                    location.reload(true);
                });
            }else if (jsonObj.status === 400) {
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——分享试题',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，TestData.setShareTest : status = "'+jsonObj.status+'"，输入参数有误！', function () {
                    location.reload(true);
                });
            }else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——分享试题',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.setShareTest : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }
        });
	}
	/********************************************************************************
    函数名：getCorrectRate
    功能：获取本章学习总人数和当前用户的击败率
    输入参数: 
    返回值: 无
    创建信息：黎萍（2014-10-23）
    修改记录：无
    审查人：无
    *******************************************************************************/
	this.getCorrectRate = function(appID,cptID,userCorrectRate,totalNum){
		var params = {
			appID : appID,
			cptID : cptID,
			userCorrectRate : userCorrectRate,
			totalNum : totalNum
        };
		var infos = '';
        G_AjaxApi.post('/api/exam/getBelowCorrectRate',params,false,function (json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) {	//200 获取数据成功
				infos = jsonObj.data;
            }else if (jsonObj.status === 300) {	//300 连接数据库失败
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取学习总人数和击败率',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，TestData.getCorrectRate:  status = "'+jsonObj.status+'"，连接数据库失败！', function () {
                    location.reload(true);
                });
            }else if (jsonObj.status === 400) {
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取学习总人数和击败率',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，TestData.getCorrectRate : status = "'+jsonObj.status+'"，输入参数有误！', function () {
                    location.reload(true);
                });
            }else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取学习总人数和击败率',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.getCorrectRate : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }
        });
		return infos;
	}
	/********************************************************************************
     功能：重考，清空用户答题记录
     输入参数: 无
     返回值：无
     最后修改人：黎萍（2015-11-25）
     修改内容：黎萍（2016-02-15）控制不是章节练习不需要进行答题记录清空
				黎萍（2016-04-08）清空章节答题记录的同时也清空本地该章节的答题统计数据
     ********************************************************************************/
	this.removeRecording = function(){
		if(_fromUrl !== 'chapterExam'){	//非章节练习答题不需要进行答题记录清空
			return;
		}
		if(typeof(G_ChapterCache)!=='undefined'){
			G_ChapterCache.removeCptIDInfo(this.getCurTest().cptID);
		}
		if(typeof(G_UserInfoCache)!=='undefined'){
			G_UserInfoCache.removeUserInfoCache(this.getCurTest().cptID);
		}
		var guid = G_Cookie.getGuid();
		if(!guid){
            //G_Prg.throw('程序运行错误，TestData.removeRecording : guid = "'+guid+'",获取数据出现异常'); 
			return;
        }
		var userID = G_Cookie.getUserID();
		if(!userID){
            G_Prg.throw('程序运行错误，TestData.removeRecording : userID = "'+userID+'",获取数据出现异常'); 
        }
		var appID = G_Cookie.getAppID();
		if(!appID){
            G_Prg.throw('程序运行错误，TestData.removeRecording : appID = "'+appID+'",获取数据出现异常'); 
        }
		var cptID=G_Cookie.getCptID();
        if(!cptID){
            G_Prg.throw('程序运行错误，TestData.removeRecording : cptID = "'+cptID+'",获取数据出现异常'); 
        }
		var params = {
			appID : appID,
			cptID : cptID,
			userID : userID,
			guid : guid
        };
        G_AjaxApi_Record.post('/api/exam/resetTestInfo',params,true,function (json) {
            var jsonObj = JSON.parse(json);
            if (jsonObj.status === 200) {	//200 获取数据成功
				return;
            }else if (jsonObj.status === 300) {	//300 连接数据库失败
				//  G_maiDian.setBugRecordInfos('程序错误','做题页面——清空答题记录',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，TestData.removeRecording:  status = "'+jsonObj.status+'"，连接数据库失败！', function () {
                    location.reload(true);
                });
            }else if (jsonObj.status === 400) {
				//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——清空答题记录',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，TestData.removeRecording : status = "'+jsonObj.status+'"，输入参数有误！', function () {
                    location.reload(true);
                });
            }else{
				//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——清空答题记录',jsonObj.status+':'+jsonObj.msg);
                G_Prg.throw('程序运行错误，不能处理 TestData.removeRecording : status = "'+jsonObj.status+'"！', function () {
                    location.reload(true);
                });
            }
        });
	};
	/********************************************************************************
     功能：保存用户的求助、纠错、讨论内容等信息到数据库
     输入参数: curTest 当前试题,type 信息类型:纠错,求助,普通信息,1:纠错,2:求助,3:普通信息,content 信息内容,appID 软件id,replyToID 回复的讨论ID
     返回值：无
     最后修改人：黎萍（2016-3-3）
     修改内容：黎萍（2016-05-19）接口请求改成同步方式
     ********************************************************************************/
	this.setDiscussionContext = function(curTest,type,content,appID,replyToID){
		var guid = G_Cookie.getGuid();
		if(!guid){
            G_Prg.throw('程序运行错误，TestData.setDiscussionContext : guid = "'+guid+'",获取数据出现异常'); 
        }
		var childTableID = curTest.subTestID;
    	var childTableName = curTest.testType;
    	var allTestID = curTest.allTestID; //题目ID
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
				return;
    		} else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——保存求助、纠错、讨论内容',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——保存求助、纠错、讨论内容',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——保存求助、纠错、讨论内容',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.setDiscussionContext=' + jsonData.status);
    		}
    	}
		var params ={};
		if(!replyToID){
			params = {
				appID : appID,
				allTestID : allTestID,
				childTableID : childTableID,
				guid : guid,
				type : type,
				content : G_Prg.shieldingWords(content)
			};
		}else{
			params = {
				appID : appID,
				allTestID : allTestID,
				childTableID : childTableID,
				guid : guid,
				replyToID :replyToID,
				type : type,
				content : G_Prg.shieldingWords(content)
			};
		}
    	G_AjaxApiShequ.post('/api/community/discussion/reply', params, false, _success);
	};
	/********************************************************************************
     功能：纠错，保存用户错题反馈内容
     输入参数: curTest 当前试题,wrongItems 纠错类型, feedbackContent 错题反馈内容,appID 软件id,userID 用户id
     返回值：无
     最后修改人：黎萍（2016-1-21）
     修改内容：黎萍（2016-01-26）添加设备判断
     ********************************************************************************/
	this.setFeedbackWrong = function(curTest,wrongItems, feedbackContent,appID,userID){
		var childTableID = curTest.subTestID;
    	var childTableName = curTest.testType;
    	var allTestID = curTest.allTestID; //题目ID
    	var styleID = curTest.styleID; //题型ID
    	var cptID = curTest.cptID;
    	var srcID = curTest.srcID;
    	var sbjID = curTest.sbjID;
		var equipment = 0; 	//设备类型 0宽屏 1窄屏

		if (navigator.userAgent.indexOf("Android") !== -1 || navigator.userAgent.indexOf("iPhone") !== -1 || navigator.userAgent.indexOf("Windows Phone") !== -1) {
			equipment = 1;
		}
        var _this = this;
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
			   return;
    		} else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——保存错题反馈',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——保存错题反馈',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——保存错题反馈',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.setFeedbackWrong：status=' + jsonData.status);
    		}
    	}
    	var params = {
    		AppID : appID,
    		UserID : userID,
    		CptID : cptID,
    		AllTestID : allTestID,
    		ChildTableID : childTableID,
    		ChildTableName : childTableName,
    		SrcID : srcID,
    		SbjID : sbjID,
    		StyleID : styleID,
    		FeedbackContent : G_Prg.shieldingWords(feedbackContent),
    		ErrorType : wrongItems,
			DeviceType : equipment
    	};
    	G_AjaxApi.asyncPost('/api/errorTestFeedback/Add', params, true, _success);
	};
	/********************************************************************************
     功能：纠错，获取用户错题反馈内容
     输入参数: curTest 当前试题,appID 软件id,userID 用户id
     返回值：无
     最后修改人：黎萍（2016-1-21）
     修改内容：黎萍（2016-03-30）采取异步获取数据方式
     ********************************************************************************/
	this.getFeedbackWrong = function(curTest,appID,userID,setFeedbackValue){
		var feedback = '';	//错题反馈信息
		var childTableID = curTest.subTestID;
    	var allTestID = curTest.allTestID; //题目ID
    	var cptID = curTest.cptID;
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
                feedback = jsonData.data[0];
				setFeedbackValue(feedback);
    		} else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取错题反馈',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取错题反馈',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取错题反馈',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.getFeedbackWrong：status=' + jsonData.status);
    		}
    	}
    	var params = {
    		AppID : appID,
    		UserID : userID,
    		CptID : cptID,
    		AllTestID : allTestID,
    		ChildTableID : childTableID
    	};
    	G_AjaxApi.post('/api/errorTestFeedback/Get', params, true, _success);
		//return feedback;
	};
	/********************************************************************************
     功能：保存用户的试题解析到数据库
     输入参数: curTest 当前试题,content 信息内容,appID 软件id
     返回值：无
     最后修改人：黎萍（2016-3-15）
     修改内容：无
     ********************************************************************************/
	this.setUserTestExplain = function(curTest,content,appID){
		var guid = G_Cookie.getGuid();
		if(!guid){
            G_Prg.throw('程序运行错误，TestData.setUserTestExplain : guid = "'+guid+'",获取数据出现异常'); 
        }
		var childTableID = curTest.subTestID;
    	var childTableName = curTest.testType;
    	var allTestID = curTest.allTestID; //题目ID
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
			   return;
    		} else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——保存用户解析',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——保存用户解析',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——保存用户解析',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.setUserTestExplain=' + jsonData.status);
    		}
    	}
		var params = {};
		if(content){
			params = {
				appID : appID,
				allTestID : allTestID,
				childTableID : childTableID,
				guid : guid,
				content : G_Prg.shieldingWords(content)
			};
			G_AjaxApiShequ.asyncPost('/api/community/analysis/submit', params, true, _success);
		}else{
			params = {
				appID : appID,
				allTestID : allTestID,
				childTableID : childTableID,
				guid : guid
			};
			G_AjaxApiShequ.post('/api/community/analysis/submit', params, false, _success);
		}
		
	};
	/********************************************************************************
     功能：从数据库获取用户的试题解析
     输入参数: curTest 当前试题
     返回值：无
     最后修改人：黎萍（2016-3-15）
     修改内容：黎萍（2016-03-29）修改异步获取数据展示
     ********************************************************************************/
	this.getUserTestExplain = function(curTest,setUserExplain){
		var appID = G_Cookie.getAppID();
 		if (!appID) {
 			G_Prg.throw('程序运行错误，TestData.getUserTestExplain : appID = "'+appID+'",获取数据出现异常'); 
 		}
		var userExplain = {};
		var childTableID = curTest.subTestID;
    	var allTestID = curTest.allTestID; //题目ID
		var _this = this;
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
                userExplain = jsonData.data[0];
				setUserExplain(userExplain);
				if(userExplain){
					_this.setUserExplain(userExplain);
				}
    		} else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取用户解析',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取用户解析',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取用户解析',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.getUserTestExplain=' + jsonData.status);
    		}
    	}
		var params = 'appID='+appID+'&allTestID='+allTestID+'&childTableID='+childTableID;
		G_AjaxApiShequ.get('/api/community/analysis/last?'+params, true, _success);
		//return userExplain;
	};
	/********************************************************************************
     功能：保存用户对讨论信息的点赞记录
     输入参数: discussionID  讨论ID,isCommended 是否点赞,0:取消点赞,1:点赞
     返回值：无
     最后修改人：黎萍（2016-3-15）
     修改内容：无
     ********************************************************************************/
	this.setDiscussionAgree = function(discussionID,isCommended){
		var guid = G_Cookie.getGuid();
		if(!guid){
            G_Prg.throw('程序运行错误，TestData.setDiscussionAgree : guid = "'+guid+'",获取数据出现异常'); 
        }
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
			   return;
    		} else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——信息的点赞操作',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——信息的点赞操作',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——信息的点赞操作',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.setDiscussionAgree ：status=' + jsonData.status);
    		}
    	}
		var params = {
			discussionID : discussionID,
			guid : guid,
			isCommended : isCommended
		};
		G_AjaxApiShequ.asyncPost('/api/community/discussion/commend', params, true, _success);
	};
	/********************************************************************************
     功能：获取讨论信息列表
     输入参数: curTest 当前试题,appID 软件id,curPage 当前页,可选参数,从0开始,
				eachPageNum 每页显示数量,可选参数,type 信息类型,可选参数,如果不传则查询所有的类型,1:纠错,2:求助,3:普通信息
     返回值：discussionData 指定试题下的所有讨论信息
     最后修改人：黎萍（2016-3-16）
     修改内容：黎萍（2016-04-01）将用户身边标识拦截去掉
     ********************************************************************************/
	this.getDiscussionList = function(curTest,appID,curPage,eachPageNum,type,showInfosList){
		var guid = G_Cookie.getGuid();
		if(!guid){
            //G_Prg.throw('程序运行错误，TestData.getDiscussionList : guid = "'+guid+'",获取数据出现异常'); 
			return;
        }
    	var allTestID = curTest.allTestID; //题目ID
		var childTableID = curTest.subTestID;
		var discussionData = {};
		var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
                discussionData = jsonData.data;
				showInfosList(discussionData);
    		}else {
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取讨论信息列表',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取讨论信息列表',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取讨论信息列表',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.getDiscussionList=' + jsonData.status);
    		}
    	}
		var params = 'appID='+appID+'&allTestID='+allTestID+'&childTableID='+childTableID+'&guid='+guid+'&curPage='+curPage+'&eachPageNum='+eachPageNum;
		if(type){
			params += '&type='+type;
		}
		G_AjaxApiShequ.get('/api/community/discussion/list?'+params, true, _success);
		//return discussionData;
	};
	/********************************************************************************
     功能：保存用户的纠正答案到数据库
     输入参数: curTest 当前试题,answer 用户纠正的答案,appID 软件id
     返回值：无
     最后修改人：黎萍（2016-3-22）
     修改内容：无
     ********************************************************************************/
	this.setCorrectionAnswer = function(curTest,answer,appID){
		var guid = G_Cookie.getGuid();
		if(!guid){
            G_Prg.throw('程序运行错误，TestData.setCorrectionAnswer : guid = "'+guid+'",获取数据出现异常'); 
        }
		var childTableID = curTest.subTestID;
    	var childTableName = curTest.testType;
    	var allTestID = curTest.allTestID; //题目ID
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
			   return;
    		}else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——保存用户的纠正答案',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——保存用户的纠正答案',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——保存用户的纠正答案',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.setCorrectionAnswer=' + jsonData.status);
    		}
    	}
		var params = {
			appID : appID,
			allTestID : allTestID,
			childTableID : childTableID,
			guid : guid,
			answer : answer
		};
		G_AjaxApiShequ.asyncPost('/api/community/correction/submit', params, true, _success);
	};
	/********************************************************************************
     功能：获取用户的纠正答案
     输入参数: curTest 当前试题
     返回值：无
     最后修改人：黎萍（2016-3-22）
     修改内容：黎萍（2016-03-29）修改异步获取数据展示
			   黎萍（2016-04-01）将用户身边标识拦截去掉
     ********************************************************************************/
	this.getCorrectionAnswer = function(curTest,setCrrection){
		var appID = G_Cookie.getAppID();
 		if (!appID) {
 			G_Prg.throw('程序运行错误，TestData.getCorrectionAnswer : appID = "'+appID+'",获取数据出现异常'); 
 		}
		var guid = G_Cookie.getGuid();
		if(!guid){
            //G_Prg.throw('程序运行错误，TestData.getCorrectionAnswer : guid = "'+guid+'",获取数据出现异常'); 
			return;
        }
		var correctionAnswer = {};
		var childTableID = curTest.subTestID;
    	var allTestID = curTest.allTestID; //题目ID
		var _this = this;
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
				if(jsonData.data.length >= 1){
					correctionAnswer = jsonData.data[0].answer;
					setCrrection(correctionAnswer);
					_this.setUserCrrect(correctionAnswer);
				}
    		}else{ 
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取用户的纠正答案',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取用户的纠正答案',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取用户的纠正答案',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.getCorrectionAnswer=' + jsonData.status);
    		}
    	}
		var params = 'appID='+appID+'&allTestID='+allTestID+'&childTableID='+childTableID+'&guid='+guid;
		G_AjaxApiShequ.get('/api/community/correction/last?'+params, true, _success);
		//return correctionAnswer;
	};
	/********************************************************************************
     功能：获取指定试题的试题纠错统计数据和试题答题数据统计
     输入参数: curTest 当前试题
     返回值：无
     最后修改人：黎萍（2016-3-22）
     修改内容：黎萍（2016-03-29）修改异步获取数据展示
     ********************************************************************************/
	this.getTestStatisticsData = function(curTest,setStatisData){
		var appID = G_Cookie.getAppID();
 		if (!appID) {
 			G_Prg.throw('程序运行错误，TestData.getTestStatisticsData : appID = "'+appID+'",获取数据出现异常'); 
 		}
		var statisticsData = {};
		var childTableID = curTest.subTestID;
    	var allTestID = curTest.allTestID; //题目ID
		var _this = this;
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
                statisticsData = jsonData.data;
				setStatisData(statisticsData);
				_this.setStatisticsData(statisticsData);
    		}else{ 
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取当前试题答题的统计数据',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取当前试题答题的统计数据',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取当前试题答题的统计数据',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.getTestStatisticsData=' + jsonData.status);
    		}
    	}
		var params = 'appID='+appID+'&allTestID='+allTestID+'&childTableID='+childTableID;
		G_AjaxApiShequ.get('/api/community/statistics?'+params, true, _success);
		//return statisticsData;
	};
	/********************************************************************************
     功能：获取用户收到的回复信息所对应的当前试题
     输入参数: 
     返回值：收到的回复信息对应的试题
     最后修改人：黎萍（2016-3-29）
     修改内容：无
     ********************************************************************************/
	function _getUserMessageTest(appID,curPage){
		var guid = G_Cookie.getGuid();
		if(!guid){
            G_Prg.throw('程序运行错误，TestData.getUserMessageTest : guid = "'+guid+'",获取数据出现异常'); 
        }
		var testData = {'StyleItems':[]};
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
				if(jsonData.data.list[0].messageID !== Number(G_Prg.getQueryString('messageID'))){
					G_Prg.alert('您有新的信息，请回到个人中心接收最新信息',function(){
						window.location.href = _fromUrl;
						return;
					});
				}
                testData.StyleItems.push(jsonData.data.list[0].testInfo);
    		}else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取指定试题讨论信息',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取指定试题讨论信息',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取指定试题讨论信息',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.getUserMessageTest=' + jsonData.status);
    		}
    	}
		var params = 'appID='+appID+'&curPage='+curPage+'&eachPageNum=1&guid='+guid;
		G_AjaxApiShequ.get('/api/community/message/list?'+params, false, _success);
		_setMessageHadRead();	//将消息标记为已读
		return testData;
	};
	/********************************************************************************
     功能：设置当前试题的信息为已读
     输入参数: 
     返回值：无
     最后修改人：黎萍（2016-3-29）
     修改内容：无
     ********************************************************************************/
	function _setMessageHadRead(){
		var guid = G_Cookie.getGuid();
		if(!guid){
            G_Prg.throw('程序运行错误，TestData._setMessageHadRead : guid = "'+guid+'",获取数据出现异常'); 
        }
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
			   return;
			}else{
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——标记讨论信息为已读',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——标记讨论信息为已读',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——标记讨论信息为已读',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData._setMessageHadRead=' + jsonData.status);
    		}
    	}
		var messageID = G_Prg.getQueryString('messageID');
		var params = {
			messageID : messageID,
			guid : guid
		};
		G_AjaxApiShequ.asyncPost('/api/community/message/read', params, true, _success);
	}
	/********************************************************************************
     功能：获取被标记‘不会’试题
     输入参数:
     返回值：收到的回复信息对应的试题
     最后修改人：黎萍（2016-3-29）
     修改内容：无
     ********************************************************************************/
    function _getUserConnotMessageTest(appID, curPage) {
        var guid = G_Cookie.getGuid();
        if (!guid) {
            G_Prg.throw('程序运行错误，TestData.getUserMessageTest : guid = "' + guid + '",获取数据出现异常');
        }
        var testData = {'StyleItems': []};
        var _success = function (json) {
            var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                if (jsonData.data.list[0].ConcernMsgID !== Number(G_Prg.getQueryString('messageID'))) {
                    G_Prg.alert('您有新的信息，请回到个人中心接收最新信息', function () {
                        window.location.href = _fromUrl;
                        return;
                    });
                }
                testData.StyleItems.push(jsonData.data.list[0].testInfo);
            } else {
                if (jsonData.status === 300) {
                    G_maiDian.setBugRecordInfos('程序错误', '做题页面——获取指定试题讨论信息', jsonData.status + ':' + jsonData.msg);
                } else if (jsonData.status >= 400 && jsonData.status < 500) {
                    G_maiDian.setBugRecordInfos('业务逻辑错误', '做题页面——获取指定试题讨论信息', jsonData.status + ':' + jsonData.msg);
                } else {
                    G_maiDian.setBugRecordInfos('其它程序错误', '做题页面——获取指定试题讨论信息', jsonData.status + ':' + jsonData.msg);
                }
                G_Prg.throw('程序运行错误，不能处理，testData.getUserMessageTest=' + jsonData.status);
            }
        }
        var params = 'appID=' + appID + '&curPage=' + curPage + '&eachPageNum=1&guid=' + guid;
		G_AjaxApiShequ.get('/api/community/concern/message?' + params, false, _success);
		_setConnotMessageHadRead();
		G_SetTestInfo.replaceImgURL(testData);
        return testData;
    };
    /********************************************************************************
     功能：设置当前不会试题的信息为已读
     输入参数:
     返回值：无
     最后修改人：黎萍（2016-8-01）
     修改内容：无
     ********************************************************************************/
    function _setConnotMessageHadRead() {
        var guid = G_Cookie.getGuid();
        if (!guid) {
            G_Prg.throw('程序运行错误，TestData._setConnotMessageHadRead : guid = "' + guid + '",获取数据出现异常');
        }
        var _success = function (json) {
            var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                return;
            } else {
                if (jsonData.status === 300) {
                    G_maiDian.setBugRecordInfos('程序错误', '做题页面——设置被标记为不会的试题的信息为已读', jsonData.status + ':' + jsonData.msg);
                } else if (jsonData.status >= 400 && jsonData.status < 500) {
                    G_maiDian.setBugRecordInfos('业务逻辑错误', '做题页面——设置被标记为不会的试题的信息为已读', jsonData.status + ':' + jsonData.msg);
                } else {
                    G_maiDian.setBugRecordInfos('其它程序错误', '做题页面——设置被标记为不会的试题的信息为已读', jsonData.status + ':' + jsonData.msg);
                }
                G_Prg.throw('程序运行错误，不能处理，testData._setConnotMessageHadRead=' + jsonData.status);
            }
        }
        var messageID = G_Prg.getQueryString('messageID');
        var params = {
            concernMsgID: messageID,
            guid: guid,
			isRead : 1
        };
        G_AjaxApiShequ.asyncPost('/api/community/concern/read', params, true, _success);
    }
    /********************************************************************************
     功能：标记当前试题为不会状态
     输入参数:
     返回值：无
     最后修改人：黎萍（2016-8-01）
     修改内容：无
     ********************************************************************************/
    this.setUnableTest = function(curTest) {
        var guid = G_Cookie.getGuid();
        if (!guid) {
            //G_Prg.throw('程序运行错误，TestData._setUnableTest : guid = "' + guid + '",获取数据出现异常');
			return;
        }
		var appID = G_Cookie.getAppID();
        if (!appID) {
            G_Prg.throw('程序运行错误，TestData._setUnableTest : appID = "' + appID + '",获取数据出现异常');
        }
        var childTableID = curTest.subTestID;
        var allTestID = curTest.allTestID;
        var _this = this;
        var _success = function (json) {
            var jsonData = JSON.parse(json);
            if (jsonData.status === 200) {
                _this.setDoExamNumber(jsonData.data.explainCount);
                return;
            } else {
                if (jsonData.status === 300) {
                    // G_maiDian.setBugRecordInfos('程序错误', '做题页面——标记试题为不会', jsonData.status + ':' + jsonData.msg);
                } else if (jsonData.status >= 400 && jsonData.status < 500) {
                    // G_maiDian.setBugRecordInfos('业务逻辑错误', '做题页面——标记试题为不会', jsonData.status + ':' + jsonData.msg);
                } else {
                    // G_maiDian.setBugRecordInfos('其它程序错误', '做题页面——标记试题为不会', jsonData.status + ':' + jsonData.msg);
                }
                G_Prg.throw('程序运行错误，不能处理，testData._setUnableTest=' + jsonData.status);
            }
        }
        var params = {
			appID : appID,
			allTestID : allTestID,
            childTableID: childTableID,
            guid: guid,
			value : 1
        };
        G_AjaxApiShequ.post('/api/community/concern/set', params, false, _success);
    }
	/********************************************************************************
     功能：设置当前试题答题统计数据、用户解析、纠错等信息
     输入参数: 
     返回值：无
     最后修改人：黎萍（2016-3-29）
     修改内容：无
     ********************************************************************************/
	this.getTestDataInfo = function(curTest,dragIndex,setUserExplain,setStatisticsData,showDiscussInfo){
		var appID = G_Cookie.getAppID();
 		if (!appID) {
 			G_Prg.throw('程序运行错误，TestData.getTestStatisticsData : appID = "'+appID+'",获取数据出现异常'); 
 		}
		var userID = G_Cookie.getUserID();
		if(!userID){
            return;
        }
		var guid = G_Cookie.getGuid();
		if(!guid){
            return;
        }
		var childTableID = curTest.subTestID;
    	var allTestID = curTest.allTestID; //题目ID
		var _this = this;
    	var _success = function (json) {
    		var jsonData = JSON.parse(json);
    		if (jsonData.status === 200) {
				var userExplain = jsonData.data.analysis[0];
				var statisticsData = jsonData.data.statistics;
				var discussCount = jsonData.data.discussioncount;
				setUserExplain(userExplain,curTest,dragIndex);
				setStatisticsData(statisticsData,dragIndex);
				showDiscussInfo(discussCount,curTest,dragIndex);
    		}else{ 
				if(jsonData.status === 300){
					//  G_maiDian.setBugRecordInfos('程序错误','做题页面——获取当前试题答题的统计数据',jsonData.status+':'+jsonData.msg);
				} else if(jsonData.status >= 400 && jsonData.status < 500){
					//  G_maiDian.setBugRecordInfos('业务逻辑错误','做题页面——获取当前试题答题的统计数据',jsonData.status+':'+jsonData.msg);
				} else{
					//  G_maiDian.setBugRecordInfos('其它程序错误','做题页面——获取当前试题答题的统计数据',jsonData.status+':'+jsonData.msg);
				}
    			G_Prg.throw('程序运行错误，不能处理，testData.getTestDataInfo=' + jsonData.status);
    		}
    	}
    	var isnewKnowledge=0;
        if(G_Prg.getQueryString('fromUrl')==='Five'){//考点精讲需要从知识点新表获取知识点内容
            isnewKnowledge=1;
        }
		var params = 'appID='+appID+'&userID='+userID+'&guid='+guid+'&allTestID='+allTestID+'&childTableID='+childTableID+'&queryNewTable='+isnewKnowledge;
		G_AjaxApiShequ.get('/api/community/testinfo?'+params, true, _success);
	};

	/********************************************************************************
     功能：从章节题目中随机抽取题目
     输入参数:
     返回值：随机试题json
     创建人：杨喜寿（2016-7-15）
     修改内容：无
     ********************************************************************************/
	function _getRandomPracticeTest(appID){
		var userID = G_Cookie.getUserID();
		var guid = G_Cookie.getGuid();
		if(!guid){
            G_Prg.throw('程序运行错误，TestData.getRandomPracticeTest : guid = "'+guid+'",获取数据出现异常');
        }
		var cptID = G_Prg.getQueryString('cptID');
		var count = G_Prg.getQueryString('count');
		var wrongFirst = G_Prg.getQueryString('wrongFirst');
		var newFirst = G_Prg.getQueryString('newFirst');
		var randomTestJson = {};
		var arrUserTest =  '';	//存储用户收藏、用户笔记的数组
		var params = {
            "userID": userID,
            "appID": appID,
            "cptID": cptID,
            "count": count,
            "wrongFirst": wrongFirst,
            "newFirst": newFirst,
            "guid": guid
        }
        var _success = function (json){
        	var jsonData = JSON.parse(json);
            if (jsonData.status == 200) {
                //处理返回的习题
                randomTestJson = jsonData.data.test;
				arrUserTest = jsonData.data.info;
				_examHistoryID = jsonData.data.examHistoryID;
            } else if (jsonData.status == 202) {
                var eerorBox = document.getElementById('nrdvMsgBox');
                if (eerorBox && eerorBox.style.display === 'block') { //判断是否有报错弹窗（被踢下线）
                    return;
                }
                G_Prg.confirm('该功能充值后才能使用！', function() {
                    var isiphone = G_Prg.getCookie('CLIENTTYPE');
                    if (isiphone && isiphone.toString().toLowerCase() === 'iphone') {
                        window.location = "ios://iOSiap";
                    } else {
                        window.location.href = '/recharge';
                    }
                },function(){
                	window.location.href = '/doExam-index';
                });
            } else if (jsonData.status === 300) {
                G_Prg.throw('程序运行错误！："' + jsonData.msg + '"！');
                //  G_maiDian.setBugRecordInfos('程序错误', '章节练习——开始答题', jsonData.status + ':' + jsonData.msg);
            } else if (jsonData.status >= 400 && jsonData.status < 500) {
                //  G_maiDian.setBugRecordInfos('业务逻辑错误', '章节练习——开始答题', jsonData.status + ':' + jsonData.msg);
            } else {
                G_Prg.throw('程序运行错误！："无法处理"！');
                //  G_maiDian.setBugRecordInfos('其它程序错误', '章节练习——开始答题', jsonData.status + ':' + jsonData.msg);
            }
        }
        G_AjaxApi.post('/api/exam/getChapterRandomTest/', params, false, _success);
        //设置图片路径
        randomTestJson = G_SetTestInfo.setFavAndNoteTest(randomTestJson,arrUserTest);	//添加用户笔记、收藏标记
		randomTestJson = G_SetTestInfo.replaceImgURL(randomTestJson);	//设置图片路径
        randomTestJson = G_SetTestInfo.sortingTest(randomTestJson);//按题型重组json
        return randomTestJson;
	}
}